2016-10-26 2 views
1

Я в процессе написания сценария python, который принимает два аргумента, которые позволят мне выводить содержимое папки в текстовый файл для меня для использования в другом процессе. Фрагмент У меня есть ниже:Python: попытка поместить содержимое папки в текстовый файл:

#!/usr/bin/python 
 

 
import cv2 
 
import numpy as np 
 
import random 
 
import sys 
 
import os 
 
import fileinput 
 

 
#Variables: 
 

 
img_path= str(sys.argv[1]) 
 
file_path = str(sys.argv[2]) 
 

 
print img_path 
 
print file_path 
 

 
cmd = 'find ' + img_path + '/*.png | sed -e "s/^/\"/g;s/$/\"/g" >' + file_path + '/desc.txt' 
 

 
print "command: ", cmd 
 

 
#Generate desc.txt file: 
 
os.system(cmd)

Когда я пытаюсь запустить, что с моей командной строки, я получаю следующий результат, и я понятия не имею, как это исправить.

sh: 1: s/$//g: not found

Я тестировал команду я использую, выполнив следующую команду в терминале, например свежей, и она работает отлично:

images/*.png | sed -e "s/^/\"/g;s/$/\"/g" > desc.txt

Кто-нибудь может понять, почему мой фрагмент не работает? Когда я запускаю его, я получаю пустой файл ...

Заранее благодарим!

+2

os.system имеет проблемы, попробуйте использовать вместо subprocess.call. Это позволяет гораздо больший контроль над вызовами внешних команд с помощью аргументов. Это, как говорится, почему порождает команду оболочки вообще? Не можете ли вы использовать os.walk и сохранить все это на Python? –

+1

вы можете использовать 'os.listdir()' с 'fnmatch.filter()' или 'glob.glob ('images/* .png')' – furas

ответ

0

не отправляет полный текст для вашего регулярного выражения в bash из-за того, как python обрабатывает и вытесняет строковое содержимое, поэтому лучшим быстрым решением было бы просто вручную удалить обратные косые черты в строке, потому что python думает, что они в настоящее время являются escape-кодами. поэтому измените эту строку:

cmd = 'find ' + img_path + '/*.png | sed -e "s/^/\"/g;s/$/\"/g" >' + file_path + '/desc.txt' 

к этому:

cmd = 'find ' + img_path + '/*.png | sed -e "s/^/\\"/g;s/$/\\"/g" >' + file_path + '/desc.txt' 

и что должно работать для вас.

хотя, комментарий на ваш вопрос имеет большую точку, вы можете полностью просто сделать это из питона, что-то вроде:

import os 
import sys  

def main(): 
    # variables 
    img_path= str(sys.argv[1]) 
    file_path = str(sys.argv[2]) 

    with open(file_path,'w') as f: 
     f.writelines(['{}\n'.format(line) for line in os.listdir(img_path) if line.endswith('*.png')]) 

if __name__ == "__main__": 
    main()   
0

Я полностью согласен с Кайлом. Моя рекомендация состоит в том, чтобы лучше использовать только код python, чем команды вызова bash из вашего кода. Здесь это мой рекомендуемый код, он длиннее и не так оптимален, как вышеупомянутый, но IMHO это более понятное решение.

#!/usr/bin/python 
 

 
import glob 
 
import sys 
 
import os 
 

 
# Taking arguments 
 
img_path = str(sys.argv[1]) 
 
file_path = str(sys.argv[2]) 
 
# lets put the target filename in a variable (it is better than hardcoding it) 
 
file_name = 'desc.txt' 
 
# folder_separator is used to define how your operating system separates folders (unix/and windows \) 
 
folder_separator = '\\' # Windows folders 
 
# folder_separator = '/' # Unix folders 
 

 
# better if you make sure that the target folder exists 
 
if not os.path.exists(file_path): 
 
    # if it does not exist, you create it 
 
    os.makedirs(file_path) 
 

 
# Create the target file (write mode). 
 
outfile = open(file_path + '/' + file_name, 'w') 
 

 
# loop over folder contents 
 
for fname in glob.iglob("%s/*" % img_path): 
 
    # for every file found you take only the name (assuming that structure is folder/file.ext) 
 
    file_name_in_imgPath = fname.split('\\')[1] 
 
    # we want to avoid to write 'folders' in the target file 
 
    if os.path.isfile(file_name_in_imgPath): 
 
     # write filename in the target file 
 
     outfile.write(str(file_name_in_imgPath) + '\n') 
 

 
outfile.close()

+0

да, это более читаемо, но требуется более чем вдвое больше строк для выполнения та же цель. Я пытался показать самое быстрое решение, но ваш путь более pythonic наверняка –

+1

Большое спасибо Кайлу. Я пытался предложить альтернативное и легко читаемое решение.Ваше решение лучше, но для опытных людей;) –

+0

ха-ха, спасибо вам также @DanielSerrano, иногда я забываю, что не все так же хорошо знакомы с питонами, которые являются более неясными функциями, чем я, но опять же они довольно полезны сейчас и опять же, даже если люди не обязательно точно знают, как это работает, пока это ха-ха. вот почему я бросаю эти маленькие самородки знания здесь и там. –

Смежные вопросы