删除列表中的扩展 python
remove extension in list python
我有以下代码,我想在某个文件夹中找到所有文件(此文件夹包含 .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)
替换此行:
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
但它基本上将文件名分成两部分。第一个是根,就是你想要的。
当您使用 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+(或安装 the third party scandir
package using scandir.scandir
instead of 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))]
我有以下代码,我想在某个文件夹中找到所有文件(此文件夹包含 .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)
替换此行:
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
但它基本上将文件名分成两部分。第一个是根,就是你想要的。
当您使用 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+(或安装 the third party scandir
package using scandir.scandir
instead of 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))]