2015-05-18 2 views
0

Я написал скрипт python для поиска всех файлов .avi в текущей папке и записи их имен в файле для последующей обработки.Python search file file

Однако я получаю пустой файл, даже если у меня есть .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

'' a.avi 'в' * .avi'' возвращает 'False' для меня. Вы уверены, что эта логика правильная?(Idk, если это работает в python 3, я использую python2.7). – RafaelC

ответ

0

открыть файл через «с»:

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") 
+0

Я пробовал, но пустой вывод. – Pentagon98

+0

@ Pentagon98: попробуйте хорошую версию. Я не доверяю вашему 'ls' thingy – RickyA

+0

@ Pentagon98: также убедитесь, что вы запустили его в каталоге, который на самом деле имеет такие файлы. – RickyA

3

in не делает такого соответствия шаблону. Предполагая, что i является строкой, просто использовать

i.endswith('.avi') 

Но ради богов, не называют строку переменной i.

Или проверить несколько концовок сразу (спасибо @msvalkon за напоминание):

i.endswith((".avi", ".mp4")) 

И вы могли бы использовать glob модуль Python, который приходит с такой функциональностью шаблона:

import glob 
with open("film.txt", "w") as f: 
    for filename in glob.glob("*.avi"): 
     print(filename, file=f) 
+0

Возможно, добавьте, что' str.endswith' принимает кортеж элементов, чтобы они соответствовали Например, OP дал: 'i.endswith ((". avi "," .mp4 "))' – msvalkon

+0

@msvalkon Спасибо, я упустил это, поскольку это не было в тексте или главном коде. Добавлено сейчас. –

+0

Вы можете использовать 'iglob', чтобы избежать создания списка –

1

Вы можете просто использовать встроенный i п 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(). Это более питоновское.

Кроме того, я использовал \n, чтобы пропустить цикл for.

+1

К сожалению, 'writelines', похоже, не добавляет окончаний строки. –

+0

Вы правы. исправлено это – tennabey

1

if i in "*.avi" делает запрос «i a подстрока '*.avi'»? Это не операция сопоставления glob.

Простейшим решением, вероятно, является использование glob вместо sh.

for i in glob.glob('*.avi') + glob.glob('*.mp4'): 
    … 
+0

проверить мое решение, которое не использует цикл 'for' – tennabey

+0

Он просит не только эти пять, попробуйте' 'av" в "* .avi" '. –

+0

@StefanPochmann О, право. Brainfart! –