使用os.walk读取多个输入文件,以及GetMessage进度更新消息

时间:2013-03-14 13:49:26

标签: python arcpy csv

我无法找到这个问题的解决方案,所以我们走了。我正在编写一个脚本来读取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 个答案:

答案 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来处理