Python 尝试使用os.path通过文件搜索创建CSV文件

Python 尝试使用os.path通过文件搜索创建CSV文件,python,csv,os.walk,Python,Csv,Os.walk,我想打开包含所有文件的主文件夹(1),搜索所有文件,只抓取标题中带有“mtn”的任何.txt文件(2),打印txt文件列表(3),然后在csv文件中列出txt文件,包括其完整路径(4) 我可以使用当前代码执行(1)到(3),但是生成的CSV文件只包含最后一个文件名,因此我认为循环的顺序有问题 在控制台中,我得到一个文件名的运行列表,并在最后找到565个文件。CSV文件应列出所有这些文件,但仅列出最后一个 我尝试在标题下为循环缩进另一个: for filename in files:

我想打开包含所有文件的主文件夹(1),搜索所有文件,只抓取标题中带有“mtn”的任何.txt文件(2),打印txt文件列表(3),然后在csv文件中列出txt文件,包括其完整路径(4)

我可以使用当前代码执行(1)到(3),但是生成的CSV文件只包含最后一个文件名,因此我认为循环的顺序有问题

在控制台中,我得到一个文件名的运行列表,并在最后找到565个文件。CSV文件应列出所有这些文件,但仅列出最后一个

我尝试在标题下为循环缩进另一个

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

但是这也不行。

模式字符串
'w+'
会导致任何现有内容被截断。也许我们可以看得更远

无论如何,您都不想重复打开和关闭同一个文件;只要在主循环外打开它一次,然后在有更多东西要写的时候再写


(切换到
'a'
而不是
'w+'
将只需很少的更改即可修复代码;但随后您会让操作系统进行大量的操作,以打开文件,查找到底,然后针对您想写的每一行再次关闭它。)

模式字符串
'w+'
会导致任何现有内容被截断。也许我们可以看得更远

无论如何,您都不想重复打开和关闭同一个文件;只要在主循环外打开它一次,然后在有更多东西要写的时候再写


(切换到
'a'
而不是
'w+'
将只需很少的更改即可修复代码;但随后您会让操作系统进行大量的操作,以打开文件,查找到底,然后针对您要写入的每一行再次关闭它。)

您正在以
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))

您在
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))

哪一条是错误消息?没有错误消息,只有一行中最后一个文件名的CSV文件,而不是565行。请提供示例文本作为文本,而不是文本图片。哪一条是错误消息?没有错误消息,只有一行中最后一个文件名的CSV文件,而不是565行。请提供exa示例文本是文本,而不是文本图片。谢谢。我使用了您的代码和下面@tripleee的提示来让它工作。我喜欢您定义变量(如模式和csv路径)的方式,看起来更整洁。谢谢。我使用了您的代码和下面@tripleee的提示来让它工作。我喜欢您定义变量的方式例如模式和csv路径,看起来更整洁。谢谢,我将open csv命令移到了外部,并在循环中使用缩进进行了调整,使其正常工作。谢谢,我将open csv命令移到了外部,并在循环中使用缩进进行了调整,使其正常工作,