为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

一只斗牛犬 2022-07-12 18:02:59
我想打开包含所有文件的主文件夹(1),搜索文件并只抓取标题中带有“mtn”的任何 .txt 文件(2),打印 txt 文件列表(3)然后列出 txt csv 文件中的文件,包括它们的完整路径 (4)。我可以使用我当前的代码执行 (1) 到 (3),但是生成的 CSV 文件只包含最后一个文件名,所以我认为我的循环顺序有问题mtnpath = r"G:\somepath\"num_files = 0for 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 文件应该列出所有这些文件,但只有最后一个。我尝试for在标题下缩进另一个循环:    for filename in files:         thewriter.writerow([filename, 'Directory', ])但这也不起作用。
查看完整描述

2 回答

?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

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


查看完整回答
反对 回复 2022-07-12
?
PIPIONE

TA贡献1829条经验 获得超9个赞

模式字符串'w+'会导致任何现有内容被截断。或许可以进一步查看python open 内置函数:模式 a、a+、w、w+ 和 r+ 之间的区别?

无论如何,您都不想重复打开和关闭同一个文件;只需在主循环之外打开一次,然后在您有更多内容要写时编写。

(切换到'a'而不是'w+'将通过最小的更改来修复您的代码;但是您随后会导致操作系统执行相当多的操作来打开文件,寻找到最后,然后为您要编写的每一行再次关闭它。 )


查看完整回答
反对 回复 2022-07-12
  • 2 回答
  • 0 关注
  • 133 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信