Как присвоить элементам списка имена файлов в python?

#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: Вот так.