使用os.walk读取多个输入文件并获取进度更新消息

3 投票
2 回答
2984 浏览
提问于 2025-04-17 19:14

我找不到这个问题的解决办法,所以我来这里问一下。我正在写一个脚本,目的是从一个CSV文件中读取数据。我想让这个代码自动化,能够在一个文件夹里重复读取多个CSV文件。我尝试使用os.walk,但遇到了一些错误。

我的问题是: 1. 我该如何正确使用os.walk? 2. 在处理输入的CSV文件时,最好的方式是什么来显示进度更新?

脚本的第一部分,我需要在这里实现os.walk,代码如下:

import sys
import os
import arcpy
import csv
from arcpy import env

## Set overwrite 
arcpy.env.overwriteOutput = True
print arcpy.env.overwriteOutput

## Set workspace 
arcpy.env.workspace = "C:\\Home\\directory\\"
workspace = "C:\\Home\\directory\\"
print workspace

for root, dirs, files in os.walk('C:\\Home\\directory\\CSV\\'):  
    print root, dirs, files
    ## Directory where I'm keeping the CSVs
    full_path = os.path.join(root, files)       

    rows = csv.DictReader(open(full_path, "rb"))
    if os.path.exists(outpath)==False:
         os.mkdir(outpath)

    for row in rows: # here begin reading through the CSV for the rest of the script

2 个回答

4

如果你想用os.walk这个方法,作为Jason的回答的另一种选择,我通常会这样做来找到CSV文件,然后对它们进行处理。

fileList = []
count = 0

directorypath = "C:\Home\directory\CSV"

for dirname, dirnames, filesnames in os.walk(directorypath):
    for filename in filenames:
       if filename.endswith(".csv"):
          fileList.append(filename)
          count = count + 1

这样你就可以直接用fileList来进行后续操作了。

4

哦,我刚看到你的问题。你在把整个文件列表 files 连接起来,创建你的 full_path 变量。如果你不需要深入到存放 csv 文件的子目录里,我建议你可以使用 glob 模块。还有,我用到了原始字符串字符 r;这个小家伙非常有用,它可以让你直接复制粘贴路径,而不需要在每个目录后面加一个反斜杠,或者把它们改成正斜杠:

import sys
import os
import arcpy
import csv
from arcpy import env
import glob

## Set overwrite 
arcpy.env.overwriteOutput = True
print arcpy.env.overwriteOutput

## Set workspace 
workspace = r"C:\Home\directory"
arcpy.env.workspace = workspace
csv_dir = os.path.join(workspace,'CSV')

print workspace

csvList = glob.glob(os.path.join(csv_dir,'*.csv'))
csvNameList = []
for full_path in csvList:

    ## Append csv file name to list
    csvNameList.append(os.path.basename(full_path))

    ## Directory where I'm keeping the CSVs
    arcpy.AddMessage(full_path)       

    rows = csv.DictReader(open(full_path, "rb"))
    if os.path.exists(outpath)==False:
         os.mkdir(outpath)

    for row in rows: # here begin reading through the CSV for the rest of the script

至于你问题的第二部分,使用 arcpy.AddMessage(csv_name) 函数可以把 csv 文件的名字打印到工具的进度屏幕上(如果你是在脚本工具中使用的话)。

撰写回答