3

この質問に対する解決策を見つけることができなかったので、ここに行きます。CSV ファイルからデータを読み取るスクリプトを作成しています。コードを自動化して、1 つのフォルダー内の複数の 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_pathcsv ファイルが置かれているサブディレクトリを掘り下げる必要がない場合は、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

質問の 2 番目の部分に答えるには、arcpy.AddMessage(csv_name)関数を使用して csv ファイルの名前をツールの進行状況画面に出力します (これをスクリプト ツールで使用している場合)。

于 2013-03-14T14:13:59.950 に答える
4

os.walk に固執したい場合のジェイソンの回答の代わりに、通常は次のようにして 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 に答える