3

我找不到这个问题的解决方案,所以我们开始吧。我正在编写一个脚本,该脚本将从 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
4

2 回答 2

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 文件的名称打印到工具进度屏幕(如果您在脚本工具中使用它)。

于 2013-03-14T14:13:59.950 回答
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 来处理

于 2013-03-14T15:17:18.943 回答