尝试使用 os.path 通过文件搜索创建 CSV 文件
Trying to create a CSV file with a file search using os.path
我想打开包含所有文件的主文件夹 (1),搜索文件并仅抓取标题中带有 "mtn" 的任何 .txt 文件 (2),打印 txt 文件列表(3) 然后在 csv 文件中列出 txt 文件,包括它们的完整路径 (4).
我可以用我当前的代码执行 (1) 到 (3),但是生成的 CSV 文件只包含最后一个文件名,所以我认为我的循环顺序有问题
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 文件应列出所有这些文件,但只有最后一个。
我尝试在 header 下缩进另一个 for
循环:
for filename in files:
thewriter.writerow([filename, 'Directory', ])
但这也不管用。
模式字符串 'w+'
会导致任何现有内容被截断。或许看得更远python open built-in function: difference between modes a, a+, w, w+, and r+?
无论如何您都不想重复打开和关闭同一个文件;只需在 主循环之外打开一次,然后在有更多内容要写时再写。
(切换到 'a'
而不是 'w+'
将通过最小的更改修复您的代码;但是您随后会导致操作系统做大量的体操来打开文件,寻求结束,然后为你想写的每一行再次关闭它。)
您在 w+
模式下多次打开文件(在文档中解释 here),这会导致其内容每次都被截断 — 这就是为什么您只看到最后一个。您实际上只需要打开文件一次,然后可以根据需要向其中写入行。
我的意思是:
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),搜索文件并仅抓取标题中带有 "mtn" 的任何 .txt 文件 (2),打印 txt 文件列表(3) 然后在 csv 文件中列出 txt 文件,包括它们的完整路径 (4).
我可以用我当前的代码执行 (1) 到 (3),但是生成的 CSV 文件只包含最后一个文件名,所以我认为我的循环顺序有问题
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 文件应列出所有这些文件,但只有最后一个。
我尝试在 header 下缩进另一个 for
循环:
for filename in files:
thewriter.writerow([filename, 'Directory', ])
但这也不管用。
模式字符串 'w+'
会导致任何现有内容被截断。或许看得更远python open built-in function: difference between modes a, a+, w, w+, and r+?
无论如何您都不想重复打开和关闭同一个文件;只需在 主循环之外打开一次,然后在有更多内容要写时再写。
(切换到 'a'
而不是 'w+'
将通过最小的更改修复您的代码;但是您随后会导致操作系统做大量的体操来打开文件,寻求结束,然后为你想写的每一行再次关闭它。)
您在 w+
模式下多次打开文件(在文档中解释 here),这会导致其内容每次都被截断 — 这就是为什么您只看到最后一个。您实际上只需要打开文件一次,然后可以根据需要向其中写入行。
我的意思是:
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))