Попытка создать файл CSV с помощью поиска файлов с помощью os.path - PullRequest
1 голос
/ 28 января 2020

Я хочу открыть основную папку, содержащую все файлы (1), выполнить поиск по файлам и захватить только файл .txt с «mtn» в заголовке (2), распечатать список файлов txt (3), затем перечислить текстовые файлы в CSV-файл, включая их полный путь (4).

Я могу сделать (1) через (3) с моим текущим кодом, однако создаваемый CSV-файл содержит только последнее имя файла , так что я думаю, что что-то не так с порядком моих циклов CSV file

mtnpath = r"G:\somepath\"
num_files = 0
for root, dirs, files in os.walk(mtnpath):
    for filename in files:
        if fnmatch.fnmatch(filename, '*mtn*'):
            num_files = num_files + 1
            with open(mtnpath + "/" + "txt_file_list.csv", 'w+', newline='') as f:
                thewriter = csv.writer(f)
                # write the header row
                thewriter.writerow(['Filename', 'Path', ])
                # write the rest of the rows with files and path
                thewriter.writerow([filename, 'Path', ])
            print(filename)
print("The total number of mtn files found was " + str(num_files))

В консоли я получаю текущий список имен файлов и оператор в конце с найденными 565 файлами. В файле CSV должны быть перечислены все эти файлы, но только последний.

2

Я попытался сделать отступ для другого for l oop под заголовком:

    for filename in files:
        thewriter.writerow([filename, 'Directory', ])

но это тоже не работает.

Ответы [ 2 ]

2 голосов
/ 28 января 2020

Вы открываете файл несколько раз в режиме w+ (объяснено здесь в документации), что приводит к урезанию его содержимого каждый раз - поэтому вы видите только последний один. На самом деле вам нужно открыть файл только один раз, а затем при необходимости записать в него строки.

Вот что я имею в виду:

import csv
import fnmatch
import os

mtn_path = r'G:\somepath'
pattern = '*mtn*'
txt_file_csv_path = os.path.join(mtn_path, 'txt_file_list.csv')

with open(txt_file_csv_path, 'w+', newline='') as f:
    thewriter = csv.writer(f)
    # Write a header row.
    thewriter.writerow(['Filename', 'Path', ])
    num_files = 0

    for root, dirs, files in os.walk(mtn_path):
        for filename in files:
            if fnmatch.fnmatch(filename, pattern):
                num_files += 1
                thewriter.writerow((filename, os.path.join(root, filename)))
                print(filename)

print('The total number of mtn files found was ' + str(num_files))
1 голос
/ 28 января 2020

Строка режима 'w+' вызывает усечение любого существующего содержимого. Возможно, смотрите далее python Открытая встроенная функция: разница между режимами a, a +, w, w + и r +?

Вы не хотите многократно открывать и закрывать одно и то же подать в любом случае; просто откройте его один раз за пределами основного l oop, а затем пишите всякий раз, когда вам есть что написать.

(переключение на 'a' вместо 'w+' исправит ваш код с минимальным изменением, но затем вы заставляете операционную систему выполнять достаточное количество упражнений, чтобы открыть файл, выполнить поиск до конца и снова закрыть его для каждой строки, которую вы хотите написать.)

...