删除列表python中的扩展名

时间:2016-06-02 13:04:44

标签: python os.walk

我有以下代码,我希望找到某个文件夹中的所有文件(此文件夹包含.TIF文件),然后将这些名称存储在目前可用的.txt文件中。但是,我不想要扩展文件夹中的任何内容。

import os, sys

f = [] 
b = os.walk('C:\\Users\\username\\Desktop\\FOLDER')
for(dirpath, dirnames, filenames) in b:
    f.extend(filenames)
    break

def save_to_file(text):
    for name in f:
        with open('C:\\Users\\username\\Desktop\\FOLDER\\test2.txt', mode='wt', encoding='utf-8') as myfile:
            myfile.write('\n'.join(text))
            myfile.write('\n')

save_to_file(f)

评论之后,特别感谢ShadowRanger,我将其更改为以下产生相同效果的内容。谢谢大家!:

import os

f = [e.name for e in os.scandir(r'C:\\Users\\user\\Desktop\\FOLDER') if e.is_file()]
print('Saving file...')

def save_to_file(text):
    for name in f:
        with open('C:\\Users\\user\\Desktop\\FOLDER\\test5.txt', mode='wt', encoding='utf-8') as myfile:
            myfile.write('\n'.join(text))
            myfile.write('\n')

save_to_file(f)

2 个答案:

答案 0 :(得分:2)

当您获得带有os.path.splitext的文件名时,删除生成器表达式中的扩展名。变化:

f.extend(filenames)

为:

f.extend(os.path.splitext(name)[0] for name in filenames)

更新:看起来你正在滥用os.walk从目录分离中执行文件(因为你在第一个循环中break,所以你实际上并没有走路当有更直接的方法来做这件事时,一棵树。你可以替换所有这些:

f = [] 
b = os.walk('C:\\Users\\username\\Desktop\\FOLDER')
for(dirpath, dirnames, filenames) in b:
    f.extend(filenames)
    break

在Python 3.5+(或使用scandir.scandir而不是the third party scandir package安装os.scandir后的任何版本的Python),更简洁,更快一点:

f = [os.path.splitext(e.name)[0] for e in os.scandir(r'C:\Users\username\Desktop\FOLDER')
     if e.is_file()]

描述了您真正想要的内容,并使用os.scandir,保证您不必单独stat目录列表中的每个条目来检查它是否是文件。

如果您使用较旧的Python,并且无法使用scandir软件包,代价是statos.walk无论如何都要支付旧版Python),能做到:

f = [os.path.splitext(x)[0] for x in os.listdir(r'C:\Users\username\Desktop\FOLDER')
     if os.path.isfile(os.path.join(r'C:\Users\username\Desktop\FOLDER', x))]

答案 1 :(得分:0)

替换此行:

f.extend(filenames)

有这样的事情:

filenames_stripped = [os.path.splitext(file)[0] for file in filenames]
f.extend(filenames_stripped)

甚至更简单:

f.extend([os.path.splitext(file)[0] for file in filenames]

有关os.path.splitext的更多信息,但它基本上将文件名拆分为2个部分。第一个是根,这是你想要的。