Pythonの組み込み.csvモジュールを使用した記述
-
06-07-2019 - |
質問
[これは既に回答済みの Pythonの組み込み.csvライターモジュールを使用して列を置き換える方法]
Excelの.csvファイルで検索と置換(URLの1列に固有)を行う必要があります。スクリプト言語を自分で習おうとする初期段階にいるので、Pythonでソリューションを実装しようと考えました。
エントリの内容を変更した後、.csvファイルに書き戻そうとすると問題が発生します。ライターの使用方法について公式のcsvモジュールのドキュメントを読みました。しかし、このケースをカバーする例はありません。具体的には、読み取り、置換、書き込みの各操作を1つのループで実行しようとしています。ただし、forループの引数とwriter.writerow()のパラメーターの両方で同じ「行」参照を使用することはできません。したがって、forループで変更を行ったら、ファイルにどのように書き戻す必要がありますか?
編集: S. LottとJimmyからの提案を実装しましたが、まだ同じ結果です
編集#2:" rb"を追加しましたおよび「wb」」 S. Lottの提案ごとにopen()関数に追加
import csv
#filename = 'C:/Documents and Settings/username/My Documents/PALTemplateData.xls'
csvfile = open("PALTemplateData.csv","rb")
csvout = open("PALTemplateDataOUT.csv","wb")
reader = csv.reader(csvfile)
writer = csv.writer(csvout)
changed = 0;
for row in reader:
row[-1] = row[-1].replace('/?', '?')
writer.writerow(row) #this is the line that's causing issues
changed=changed+1
print('Total URLs changed:', changed)
編集:参考までに、これはインタープリターからの新しい完全なトレースバックです:
Traceback (most recent call last):
File "C:\Documents and Settings\g41092\My Documents\palScript.py", line 13, in <module>
for row in reader:
_csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)
解決
同じファイルを読み書きすることはできません。
source = open("PALTemplateData.csv","rb")
reader = csv.reader(source , dialect)
target = open("AnotherFile.csv","wb")
writer = csv.writer(target , dialect)
すべてのファイル操作に対する通常のアプローチは、元のファイルの変更されたコピーを作成することです。所定の場所でファイルを更新しようとしないでください。それは悪い計画です。
編集
行内
source = open("PALTemplateData.csv","rb")
target = open("AnotherFile.csv","wb")
&quot; rb&quot;および「wb」」絶対に必要です。それらを無視するたびに、間違った形式で読み取るためにファイルを開きます。
&quot; rb&quot;を使用する必要があります.CSVファイルを読み取ります。 Python 2.xでは選択の余地はありません。 Python 3.xでは、これを省略できますが、&quot; r&quot;を使用します。明確にするために明示的に。
&quot; wb&quot;を使用する必要があります.CSVファイルを書き込む。 Python 2.xでは選択の余地はありません。 Python 3.xでは、&quot; w&quot;を使用する必要があります。
編集
Python3を使用しているようです。 「b」をドロップする必要があります。 「rb」からおよび&quot; wb&quot;。
これを読む: http://docs.python.org/3.0/ library / functions.html#open
他のヒント
csvファイルをバイナリとして開くのは間違っています。 CSVは通常のテキストファイルなので、次のコマンドで開く必要があります
source = open("PALTemplateData.csv","r")
target = open("AnotherFile.csv","w")
エラー
_csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)
バイナリモードで開いているためです。
PythonでExcel CSVを開いていたとき、次のようなものを使用しました:
try: # checking if file exists
f = csv.reader(open(filepath, "r", encoding="cp1250"), delimiter=";", quotechar='"')
except IOError:
f = []
for record in f:
# do something with record
それはかなり速く動作しました(3.0バージョンではなくpython 2.6でこれを行いましたが、各csvファイルを約10MB開いていました)。
Python内からExcel CSVファイルを操作するための作業モジュールはほとんどありません- pyExcelerator はそれら。
問題は、あなたが読んでいるのと同じファイルに書き込もうとしていることです。別のファイルに書き込み、元のファイルを削除してから名前を変更します。