我无法找到这个问题的解决方案,所以我们走了。我正在编写一个脚本来读取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
答案 0 :(得分:4)
哦,我刚看到你的问题。您正在加入整个列表files
以创建full_path
变量。如果您不需要深入了解csv文件所在的子目录,我可以使用glob
模块。我还使用了rawstring字符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文件的名称打印到工具进度屏幕(如果您在脚本工具中使用此功能)。
答案 1 :(得分: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来处理
了