我写了一个python脚本来搜索当前文件夹中的所有.avi
文件,并将它们的名字写在一个文件中以供以后处理。
但是我只得到一个空文件,即使我的文件夹中有.avi
。
这是我的代码:
import sh
f = open("film.txt", "w")
ending = [".avi", ".mp4"]
lsa = sh.ls("-a")
for i in lsa:
if i in "*.avi":
print(i, file=f)
f.close()
答案 0 :(得分:3)
in
不进行此类模式匹配。假设i
是一个字符串,只需使用
i.endswith('.avi')
但是为了上帝的缘故,不要调用字符串变量i
。
或者一次检查多个结局(感谢@msvalkon提醒):
i.endswith((".avi", ".mp4"))
你可以使用Python的glob
模块,它具有这样的模式功能:
import glob
with open("film.txt", "w") as f:
for filename in glob.glob("*.avi"):
print(filename, file=f)
答案 1 :(得分:1)
文件写入应该像这样:
f.write(i)
但您可能也遇到if i in "*.avi":
所以你的代码将是
import sh
f = open("film.txt", "w")
ending = [".avi", ".mp4"]
lsa = sh.ls("-a")
for i in lsa:
for end in ending:
if i.endswith(end):
print("found one {}".format(i))
f.write(i)
f.close()
现在很好的版本:
import glob, itertools
patterns = ["*.avi","*.mp4"]
with open("film.txt", "w") as ofile:
for fl in itertools.chain.from_iterable(glob.glob(pattern) for pattern in patterns):
ofile.write(fl + "\n")
答案 2 :(得分:1)
您可以简单地使用内置的glob
模块,它完全符合您的要求:
import glob
with open("film.txt", "w") as f:
f.write("\n".join(glob.glob("*.avi") + glob.glob("*.mp4")))
glob.glob
搜索与特定模式匹配的文件。如果您使用我写的内容,它将搜索当前目录中具有.avi
或.mp4
文件扩展名的文件
请注意使用上下文管理器(with open(...)
)而不是f = open(...)
和f.close()
。这更像是pythonic。
此外,我使用\n
加入来跳过for
循环。
答案 3 :(得分:1)
if i in "*.avi"
正在做的是问“i
是'*.avi'
的子串?”这不是一个全局匹配操作。
最简单的解决方案可能是使用glob
而不是sh
。
for i in glob.glob('*.avi') + glob.glob('*.mp4'):
…
答案 4 :(得分:0)
使用"打开文件"
with open("film.txt", "w") as f:
for root, _, files in os.walk(os.getcwd()):
for file in files:
if file.endswith((".avi", ".mp4")):
f.write(file)
答案 5 :(得分:0)
稍微修改了李雨的答案。
1st)定义一个函数:
def search_ending(path, extension):
for root, dir, filenames in os.walk(path):
for filename in filenames:
if os.path.splitext(filename)[-1] == extension:
yield os.path.join(root, filename)
2nd)调用该函数并将结果放在列表中:
ext_list = list(search_pos(os.getcwd(), '.jpg'))
3rd),您可以显示它
for line in ext_list:
print('\n'+ line)