使用os.walk读取多个输入文件并获取进度更新消息
我找不到这个问题的解决办法,所以我来这里问一下。我正在写一个脚本,目的是从一个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 文件的名字打印到工具的进度屏幕上(如果你是在脚本工具中使用的话)。