如何使这个python(2.7)脚本与unicode文件名一起使用?

时间:2015-11-06 10:34:55

标签: python windows python-2.7 unicode python-unicode

我有以下脚本来处理带有非拉丁字符的文件名:

import os
filelst = []
allfile = os.listdir(os.getcwd())
for file in allfile:
        if os.path.isfile(file):
            filelst.append(file)

w = open(os.getcwd()+'\\_filelist.txt','w+')

for file in allfile:
    w.write(file)
    w.write("\n")
w.close()

我的文件夹中的文件列表:

new 1.py
ああっ女神さまっ 小っちゃいって事は便利だねっ.1998.Ep0108.x264.AC3CalChi.avi
ああっ女神さまっ 小っちゃいって事は便利だねっ.1998.Ep0108.x264.AC3CalChi.srt

输出_filelist.txt:

new 1.py
???????? ??????????????.1998.Ep01-08.x264.AC3-CalChi.avi
???????? ??????????????.1998.Ep01-08.x264.AC3-CalChi.srt

2 个答案:

答案 0 :(得分:2)

您应该通过将Unicode文件路径传递给listdir来获取文件列表作为Unicode字符串。在您使用getcwd时,请使用:os.getcwdu()

然后使用文本编码包装器打开输出文件。 io模块是执行此操作的新方法(io正确处理通用换行符。)

全部放在一起:

import os
import io

filelst = []
allfile = os.listdir(os.getcwdu())
for file in allfile:
        if os.path.isfile(file):
            filelst.append(file)

w = io.open(os.getcwd()+'\\_filelist.txt','w+', encoding="utf-8")

for file in allfile:
    w.write(file)
    w.write("\n")
w.close()

在Windows和OS X中,这将在强制执行文件名转换时起作用。在Linux中,文件名可以是任何编码(或者根本不是!)。因此,确保创建文件(avi + srt)的任何内容都使用UTF-8,您的终端设置为UTF-8,并且您的语言环境为UTF-8。

答案 1 :(得分:1)

您需要使用正确的编码打开文件以在其中编写unicode。您可以使用codecs module打开文件:

import codecs
with codecs.open(os.getcwd()+'\\_filelist.txt','w+',encoding='your-encoding') as w:
    for file in allfile:
        w.write(file + '\n')

您可以使用UTF-8作为编码,这是一种通用编码或基于您的unicode类型的其他正确编码。另请注意,您可以使用with statement来打开文件并手动关闭它。打开文件,该文件将在块结束时自动关闭文件。