#python #python-2.7 #python-3.x #io #python-3.5
#python #python-2.7 #python-3.x #io #python-3.5
Вопрос:
Я пытаюсь назначить элементы списка в качестве имен для некоторых файлов, которые находятся в каталоге, пока я создал функцию, которая восстанавливает имя каждого файла из каталога и возвращает их в виде списка:
def retrive(directory_path):
path_names = []
for filename in sorted(glob.glob(os.path.join(directory_path, '*.pdf'))):
retrieved_files = filename.split('/')[-1]
path_names.append(retrieved_files)
print (path_names)
Приведенная выше функция возвращает в списке имена каждого файла, затем я записываю файлы в другой каталог следующим образом:
path = os.path.join(new_dir_path, "list%d.txt" % i)
#This is the path of each new file:
#print(path)
with codecs.open(path, "w", encoding='utf8') as filename:
for item in [a_list]:
filename.write(item "n")
Наконец, мой вопрос: как я могу назначить в качестве имени каждого файла, каждого элемента path_names
?, что-то вроде этой строки:
path = os.path.join(new_dir_path, "list%d.txt" % i)
Я также пытался использовать format()
функцию. Однако я все еще не могу присвоить правильное имя каждому файлу.
Вот полный сценарий:
def transform_directoy(input_directory, output_directory):
import codecs, glob, os
from tika import parser
all_texts = []
for filename in sorted(glob.glob(os.path.join(input_directory, '*.pdf'))):
parsed = parser.from_file(filename)
texts = parsed['content']
all_texts.append(texts)
for i , a_list in enumerate(all_texts):
new_dir_path = output_directory
#print(new_dir_path)
path = os.path.join(new_dir_path, "list%d.txt" % i)
with codecs.open(path, "w", encoding='utf8') as filename:
for item in [a_list]:
filename.write(item "n")
Желаемый результат будет состоять из фактических имен каждого обработанного файла.
Комментарии:
1. Почему вы открываете файлы, когда все, что вам нужно, это их имена?
2. И почему вы используете
codecs.open()
вместо простогоopen()
?3. Спасибо за помощь, ребята, потому что я переписываю их и обрабатываю в разных форматах @JohnGordon
4. @TigerhawkT3 я их предварительно обрабатываю… Я опустил некоторые части кода только из соображений экономии места.
5. Продолжайте и опубликуйте этот код. Нам недостаточно этого примера кода, чтобы помочь вам.
Ответ №1:
Вы почти на месте:
for path_name in path_names:
path = os.path.join(new_dir_path, "list%s.txt" % path_name)
#This is the path of each new file:
#print(path)
with codecs.open(path, "w", encoding='utf8') as f:
for item in [a_list]:
f.write(item "n")
Обновление на основе обновленного примера кода. Здесь вы используете разные циклы, и это не идеально, если вы не выполняете обработку между двумя циклами. Поскольку я собираюсь сохранить эту структуру, нам нужно будет обязательно связать каждый блок содержимого с исходным именем файла. Наилучшей структурой для этого является dict , и в случае, если порядок важен, мы используем an OrderedDict
. Теперь, когда мы перебираем имя файла, пары содержимого в OrderedDict
, мы захотим изменить расширение файла, чтобы оно соответствовало новому типу файла. К счастью, в python есть несколько полезных утилит для управления файлами / путями в os.path
модуле. os.path.basename
может использоваться для удаления каталога из файла и os.path.splitext
удаления расширения из имени файла. Мы используем оба из них, чтобы получить только имя файла без расширения, а затем добавить .txt
для обозначения нового типа файла. Собрав все это вместе, мы получаем :
def transform_directoy(input_directory, output_directory):
import codecs, glob, os
from collections import OrderedDict
from tika import parser
all_texts = OrderedDict()
for filename in sorted(glob.glob(os.path.join(input_directory, '*.pdf'))):
parsed = parser.from_file(filename)
filename = os.path.basename(filename)
texts = parsed['content']
all_texts[filename] = texts
for i, (original_filename, a_list) in enumerate(all_texts.items()):
new_filename, _ = os.path.splitext(original_filename)
new_filename = '.txt'
new_dir_path = output_directory
#print(new_dir_path)
path = os.path.join(new_dir_path, new_filename)
# Print out the name of the file we are processing
print('Transforming %s => %s' % (original_filename, path,))
with codecs.open(path, "w", encoding='utf8') as filename:
for item in [a_list]:
filename.write(item "n")
Второе обновление: OP спросил, как бы я написал этот код, если бы это было все, что было, так что здесь идет:
# move imports to top of file: PEP 8
import codecs, glob, os
from tika import parser
def transform_directoy(input_directory, output_directory):
for filename in sorted(glob.glob(os.path.join(input_directory, '*.pdf'))):
parsed = parser.from_file(filename)
parsed_content = parsed['content']
original_filename = os.path.basename(filename)
new_filename, _ = os.path.splitext(original_filename)
new_filename = '.txt'
path = os.path.join(output_directory, new_filename)
# Print out the name of the file we are processing
print('Transforming %s => %s' % (original_filename, path,))
# no need for a second loop since we can piggy back off the first loop
with codecs.open(path, "w", encoding='utf8') as filename:
# No need for a for loop here since our list only has one item
filename.write(parsed_content)
filename.write("n")
Комментарии:
1. Спасибо за помощь!. Однако я не сохраняю исходное имя файлов, также один файл отсутствует, когда я их переписываю, есть идеи, как поступить?. Спасибо!
2. Ваш вопрос был буквально:
Finally, my question is: how can I assign as a name of each file, each element of path_names?
что для меня означало, я хочу сохранить исходные имена файлов. Итак, пожалуйста, отредактируйте свой вопрос, чтобы точно указать, на какой вопрос вы хотите получить ответ, и опубликуйте весь свой код.3. Спасибо за помощь 2ps Я обновил вопрос со всем сценарием, спасибо!
4. @tumbleweed: я обновил пример кода. Я убрал имя каталога и добавил более описательный оператор печати. Дайте мне знать, если вам нужна дополнительная помощь.
5. @tumbleweed: Вот так.