我有以下代码,我希望找到某个文件夹中的所有文件(此文件夹包含.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)
答案 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
软件包,代价是stat
(os.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个部分。第一个是根,这是你想要的。