无法处理 python 中的文件名 2

Fail to deal with the filename in python 2

我从 github 克隆了某人的代码并尝试 运行 但失败了。错误指向这个函数:

# processing files in a directory
# return {b:'d:f d:f ...', ...}
def proc_dir(dwid_dir):
    bf = defaultdict(str)
    for fname in sorted(os.listdir(dwid_dir), key=lambda d:int(d.split('.')[0])):
        day_bf = bitermFreq(dwid_dir + fname)
        for b, f in day_bf.items():
            bf[b] += '%s:%d ' % (fname.split('.')[0], f)

    return bf

具体来说,这行代码:

for fname in sorted(os.listdir(dwid_dir), key=lambda d:int(d.split('.')[0])):

该目录中所有文件的名称格式如下:{int number}.txt。例如,0.txt

但是,出现错误:

Traceback (most recent call last):


File "bitermDayFreq.py", line 11, in proc_dir
for fname in sorted(os.listdir(dwid_dir), key=lambda d:int(d.split('.')[0])):
File "bitermDayFreq.py", line 11, in <lambda>
for fname in sorted(os.listdir(dwid_dir), key=lambda d:int(d.split('.')[0])):
ValueError: invalid literal for int() with base 10: ''

作者告诉我他可以 运行 成功地编写此代码。我想知道这是否与编码问题有关。以及如何解决?提前谢谢你。

有一个带前导点 (.) 的文件导致 d.split('.') 到 return 一个以空字符串作为第一项的列表:

>>> '.hidden'.split('.')
['', 'hidden']

要跳过带前导点的文件(UNIX 中的隐藏文件),请替换以下行:

for fname in sorted(os.listdir(dwid_dir), key=lambda d:int(d.split('.')[0])):

与:

for fname in sorted([fn for fn in os.listdir(dwid_dir) if not fn.startswith('.')],
                    key=lambda d:int(d.split('.')[0])):

使用 list comprehension.


>>> filenames = ['.hidden', '12.txt', '2.txt']
>>> sorted([fn for fn in filenames if not fn.startswith('.')],
           key=lambda d:int(d.split('.')[0]))
['2.txt', '12.txt']