【问题标题】:How to write Chinese characters to file by python如何通过python将汉字写入文件
【发布时间】:2016-06-12 16:52:30
【问题描述】:

我正在浏览一个目录并想将所有文件名写入一个文件。这是一段代码

with open("c:/Users/me/filename.txt", "a") as d:
   for dir, subdirs, files in os.walk("c:/temp"):
      for f in files:
         fname = os.path.join(dir, f)
         print fname
         d.write(fname + "\n")
d.close()

我的问题是,有些文件是用汉字命名的。通过使用print,我可以在控制台中正确地看到文件名,但是在目标文件中,它只是一团糟......我试图像open(u"c:/Users/me/filename.txt", "a")一样打开文件,但它没有工作。我也试过写fname.decode("utf-16"),还是不行……

【问题讨论】:

  • fname.encode('utf8')
  • @TimPietzcker 我认为中文字符在文件名中。 :-)
  • 作为提示,如果您可以使用/安装 python3,那就去做吧……问题可能会神奇地消失!
  • Python 3x 版本支持 unicode 字符。所以使用 3x 版本。
  • This 问题详细介绍了如何为 UTF 准备文件。

标签: python


【解决方案1】:

在将fname 写入文件之前,使用str.encode() 对其进行编码:

d.write(fname.encode('utf8') + '\n')

【讨论】:

  • 不起作用。 UnicodeDecodeError: 'ascii' codec can't decode byte 0xd6 in position 8: ordinal not in range(128)。我认为原因是字符串已经编码?
【解决方案2】:

在 Python 2 中,如果您要处理 ASCII 以外的编码,最好使用 codecs.open()。这样,您无需手动编码您编写的所有内容。此外,如果您希望文件名中包含非 ASCII 字符,则应将 os.walk() 传递给 Unicode 字符串:

import codecs
with codecs.open("c:/Users/me/filename.txt", "a", encoding="utf-8") as d:
   for dir, subdirs, files in os.walk(u"c:/temp"):
      for f in files:
         fname = os.path.join(dir, f)
         print fname
         d.write(fname + "\n")

无需调用d.close()with 块已经处理好了。

【讨论】:

  • 引发错误.. UnicodeDecodeError: 'ascii' codec can't decode byte 0xd6 in position 8: ordinal not in range(128)
【解决方案3】:

关键是告诉python准备文件以“utf-8”格式使用。我想知道为什么 python 默认不假设 utf-8 。无论如何,请尝试以下操作:

with open("c:/Users/me/filename.txt", "a", encoding='utf-8') as d:
    for dir, subdirs, files in os.walk("c:/temp"):
        ...

我正在使用 python3.5。因此,请注意“编码”选项在 python 2.7 中可能不可用。但这个想法是提前告诉 python 编码,而不是稍后与每个字符串的编码作斗争。

【讨论】:

    【解决方案4】:

    要在 python 2 中成功编写汉字,您必须执行以下操作。

    1. 使用允许您提供的编解码器库打开文件 编码参数并将其设置为 unicode。
    2. 将字符串写入 unicode 编码。

    更正后的代码如下:

    import codecs
    
    with codecs.open("c:/Users/me/filename.txt", "a", encoding='utf-8') as d:
        for dir, subdirs, files in os.walk("c:/temp"):
            for f in files:
                fname = os.path.join(dir, f)
                print fname
                d.write(fname.decode('utf-8') + "\n")
    

    注意

    同样的问题在 python 3 中不存在,所以你也应该考虑让你的脚本兼容 python 3。

    【讨论】:

      【解决方案5】:

      with open("xyz.xml', "w", encoding='utf-8-sig') as f: 为我工作。

      【讨论】:

      • with open("xyz.xml', "a", encoding='utf-8-sig') as f: 为我工作
      猜你喜欢
      • 2018-07-18
      • 2015-08-06
      • 1970-01-01
      • 1970-01-01
      • 2020-09-29
      • 1970-01-01
      • 1970-01-01
      • 2019-11-09
      • 2010-12-31
      相关资源
      最近更新 更多