5

改行である各行/行の中央に ^M 文字を持つ Python で csv ファイルを処理しようとしています。「rU」以外のモードでファイルを開くことができません。

「rU」モードでファイルを開くと、改行が読み込まれ、ファイルが分割され (改行が作成されます)、行数が 2 倍になります。

改行を完全に削除したい。どのように?

4

1 に答える 1

16

ドキュメントが言うように、注意してください:

csvfileは、イテレータプロトコルをサポートし、メソッドが呼び出されるたびに文字列を返す任意のオブジェクトにすることができますnext()。ファイルオブジェクトとリストオブジェクトの両方が適しています。

readerしたがって、またはに渡す前に、いつでもファイルにフィルターを貼り付けることができますDictReader。これの代わりに:

with open('myfile.csv', 'rU') as myfile:
    for row in csv.reader(myfile):

これを行う:

with open('myfile.csv', 'rU') as myfile:
    filtered = (line.replace('\r', '') for line in myfile)
    for row in csv.reader(filtered):

これ'\r'がPython(およびC)のスペルの方法です^M。したがって、これは、各文字を空の文字列に置き換えることにより、表示される場所に関係なく、すべての^M文字を削除するだけです。


フィルタリングするのではなく、ファイルを永続的に変更したいと思います。

まず、Pythonスクリプトを実行する前にファイルを変更したい場合は、Pythonの外部から変更してみませんか?sed、、tr多くのテキストエディタなどがすべてこれを行うことができます。次に、GNUsedの例を示します。

gsed -i'' 's/\r//g' myfile.csv

しかし、Pythonでそれを実行したい場合は、それほど冗長ではなく、読みやすくなる可能性があります。

まず、途中から挿入または削除する場合は、ファイルをインプレースで実際に変更することはできません。通常の解決策は、新しいファイルを作成し、新しいファイルを古いファイルの上に移動するか(Unixのみ)、古いファイルを削除する(クロスプラットフォーム)ことです。

クロスプラットフォームバージョン:

os.rename('myfile.csv', 'myfile.csv.bak')
with open('myfile.csv.bak', 'rU') as infile, open('myfile.csv', 'wU') as outfile:
    for line in infile:
        outfile.write(line.replace('\r'))
os.remove('myfile.csv.bak')

それほど不格好ではありませんが、Unixのみのバージョン:

temp = tempfile.NamedTemporaryFile(delete=False)
with open('myfile.csv', 'rU') as myfile, closing(temp):
    for line in myfile:
        temp.write(line.replace('\r'))
os.rename(tempfile.name, 'myfile.csv')
于 2013-01-17T23:48:08.663 に答える