【问题标题】:Formatted output to file (write())格式化输出到文件 (write())
【发布时间】:2020-11-19 18:19:42
【问题描述】:

当我尝试使用 .format() 将信息写入文件时遇到问题。

我正在尝试将已从文本文件中读取的write() 文本写入另一个文件,然后写入有关每一行的信息:

  • {0} - 行数

  • {1} - 该行有多少个空格符号

  • {2} - 该行共有多少个符号

def Spausdinti_Faile(duom, tarpai_kiek, simboliai_kiek):
    with open("rez.txt", "w") as fout:

        i = 0
        for i in range(len(duom)):
            fout.write(duom[i])

        print(tarpai_kiek, simboliai_kiek)
        i = 0
        for i in range(len(duom)):
            fout.write("{0} eilutė turi {1} tarpų simbolių ir {2} 
            simbolių.".format(str(i + 1), str(tarpai_kiek[i]), 
            str(simboliai_kiek[i])))

我收到此错误:

【问题讨论】:

  • 请提供预期的minimal, reproducible example。不接受站外链接和文字图片;我们需要您的问题是独立的,以符合本网站的目的。
  • @Prune 虽然错误的图像不是最佳的,但在任何 Windows 机器上都可以轻松重现该问题。

标签: python python-3.x character-encoding file-encodings


【解决方案1】:

由于您使用的是 Windows,因此文件的默认字符编码是……有限的。

您的语言中的某些字符无法以该字符编码表示,因此您会收到一个错误。

使用 UTF-8 编码打开文件;它可以代表任何字符:

with open("rez.txt", "w", encoding="UTF-8") as fout:

您也可以set the PYTHONUTF8=1 environment variable 在 Windows 上将 Python 默认设置为 UTF-8 —— 它已经是其他平台上的默认设置。

【讨论】:

  • 即使在非 Windows 系统上,我认为明确指定编码而不是依赖某些默认设置是明智的。 (如果您之前依赖系统默认值,现在设置了PYTHONUTF8 变量,那么旧应用程序的行为也会发生变化,这可能会导致数据损坏。)
  • 另请注意,UTF-8 不是唯一的选择。示例中的格式字符串也可以使用“windows-1257”进行编码,这通常用于立陶宛语。由 OP 决定应该使用哪种编码。但确实这种情况下的默认编码不适合这个文本。
  • 对于互操作性,我认为 UTF-8 仍然是最佳选择 :)
  • 我同意,但我认为这是一个必须有意识地做出的选择。
【解决方案2】:

加上@AKX 的好答案,您可以大大简化您的代码:

def Spausdinti_Faile(duom, tarpai_kiek, simboliai_kiek):
    with open("rez.txt", "w", encoding="UTF-8") as fout:
        fout.write(''.join(duom))
        print(tarpai_kiek, simboliai_kiek)
        for i, v in enumerate(duom):
            fout.write(f"{i + 1} eilutė turi {tarpai_kiek[i]} tarpų simbolių ir {simboliai_kiek[i]} simbolių.")

如果duom 不一定只包含字符串,请将@​​987654323@ 更改为fout.write(''.join(map(str, duom))) (感谢AKX 指出)

【讨论】:

  • 虽然应该注意 f-strings 需要 Python 3.6 或更高版本。
  • 另外,如果duom 中存在字符串以外的值,join 将不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多