【问题标题】:Python reading unicode file namesPython 读取 unicode 文件名
【发布时间】:2013-06-30 12:11:11
【问题描述】:

我是 Python 新手。我正在尝试使用os.path.getsize() 来获取文件的大小。但是,如果文件名不是英文,而是中文、德文、法文等,Python就无法识别,也不返回文件的大小。你能帮我吗?如何让 Python 识别文件名并返回此类文件的大小?

例如:文件名是:“Показатели естественного и миграционного прироста до 2030г.doc”。 path="C:\xxxx\xxx\xxxx\Показатели естественного и миграционного прироста до 2030г.doc"

我想使用os.path.getsize(path)。但它不识别文件名。请您告诉我该怎么办?

非常感谢!

import codecs,cStringIO

class UnicodeWriter:

        def __init__(self, f, dialect=csv.excel, encoding="utf-8-sig", **kwds):
        self.queue = cStringIO.StringIO()
        self.writer = csv.writer(self.queue, dialect=dialect, **kwds)
        self.stream = f
        self.encoder = codecs.getincrementalencoder(encoding)()
    def writerow(self, row):
        self.writer.writerow([s.encode("utf-8") for s in row])
        data = self.queue.getvalue()
        data = data.decode("utf-8")
        data = self.encoder.encode(data)
        self.stream.write(data)
        self.queue.truncate(0)
    def writerows(self, rows):
        for row in rows:
            self.writerow(row)

【问题讨论】:

  • 这对我来说似乎在 python 中运行良好。但是我正在运行linux。这可能取决于平台(例如仅影响 Windows)。所以我很抱歉,因为我对此无能为力。但是我建议尝试使用转义码,例如“\xd0”代表“П”。

标签: python-2.7 unicode size


【解决方案1】:

使用 Unicode 路径并确保指定 源文件 保存的编码:

#python2
#coding: utf8
import os
path = u'Показатели естественного и миграционного прироста до 2030г.doc'
with open(path,'w') as f:
    f.write('hello')
print os.path.getsize(path)

结果:

5

检查文件是否正确创建:

C:\>dir *.doc
 Volume in drive C has no label.
 Volume Serial Number is CE8B-D448

 Directory of C:\

07/02/2013  09:51 PM                 5 Показатели естественного и миграционного прироста до 2030г.doc
               1 File(s)              5 bytes
               0 Dir(s)  83,018,432,512 bytes free

根据评论进行编辑

如果您需要处理大量文件,请使用os.listdir(u'path/to/files')(带有 Unicode 目录路径),它将读取目录并返回 Unicode 格式的文件名。如果需要递归,请使用os.walk(u'path/to/files')

【讨论】:

  • 非常感谢!但是如果我有很多文件要读怎么办?我
  • 谢谢。但是为什么当我尝试 path = u'Показатели естественного и миграционного прироста до 2030г.doc' 时,Python 会告诉我“输入中不支持的字符”?
  • 您是否添加了#coding: utf8 评论?这告诉 Python 源文件保存在什么编码中。您显然还必须以该编码保存源文件。如果你忽略它,Python 2.x 假定为 ASCII,你将无法在源代码中使用非 ASCII 字符。您可以使用其他编码,但 UTF-8 支持所有 Unicode 字符。
  • 我明白了。多谢!如果我还想将原始名称写入 csv 文件,我还需要做其他事情吗?我可以使用 unicode() 或 .encode() 或 .decode() 函数吗?基本上,我正在做的是输入一个路径并使用 os.walk() 搜索所有文件,并希望将文件的名称和大小返回到 csv 文件中。非常感谢!
  • .encode() 会执行此操作,或查看 Python csv 文档底部的 csv 模块和示例。如果您遇到问题,请提出另一个问题,如果有帮助,请接受此问题的答案。
猜你喜欢
  • 1970-01-01
  • 2013-08-08
  • 2017-10-01
  • 2010-11-11
  • 1970-01-01
  • 2018-03-25
  • 1970-01-01
  • 1970-01-01
  • 2010-11-27
相关资源
最近更新 更多