6

このトピックにはすでに何かがあるようです ( Python でこれらすべての特殊文字を空白に置き換えるにはどうすればよいですか? ) が、私の人生ではこの単純なタスクを理解することはできません。

75 列とほぼ 4000 行の .CSV ファイルがあります。すべての「特殊文字」($ # & * ect) を「_」に置き換えて、新しいファイルに書き込む必要があります。これが私がこれまでに持っているものです:

import csv

input = open('C:/Temp/Data.csv', 'rb')
lines = csv.reader(input)
output = open('C:/Temp/Data_out1.csv', 'wb')
writer = csv.writer(output)

conversion = '-"/.$'
text =  input.read()
newtext = '_'
for c in text:
    newtext += '_' if c in conversion else c
    writer.writerow(c)

input.close()
output.close()

これで成功するのは、出力ファイルにすべてを 1 つの列として書き込んで、65K を超える行を生成することだけです。さらに、スペシャルキャラクターも登場!

冗長な質問で申し訳ありません。前もって感謝します!

4

4 に答える 4

4

私は次のようなことをするかもしれません

import csv

with open("special.csv", "rb") as infile, open("repaired.csv", "wb") as outfile:
    reader = csv.reader(infile)
    writer = csv.writer(outfile)
    conversion = set('_"/.$')
    for row in reader:
        newrow = [''.join('_' if c in conversion else c for c in entry) for entry in row]
        writer.writerow(newrow)

どちらが回る

$ cat special.csv
th$s,2.3/,will-be
fixed.,even.though,maybe
some,"shoul""dn't",be

(引用された値があることに注意してください)に

$ cat repaired.csv 
th_s,2_3_,will-be
fixed_,even_though,maybe
some,shoul_dn't,be

現在、コードはテキスト全体を 1 つの大きな行に読み込んでいます。

text =  input.read()

文字から開始_:

newtext = '_'

のすべての文字をループするtext:

for c in text:

修正した文字をnewtext(非常にゆっくりと) に追加します。

    newtext += '_' if c in conversion else c

そして、元の文字 (?) を列として新しい csv に書き込みます。

    writer.writerow(c)

..これはあなたが望むものである可能性は低いです。:^)

于 2013-04-01T20:20:18.737 に答える
4

これは、特に CSV を処理する必要はないようです (特殊文字が列の区切り記号でない限り)。

lines = []
with open('C:/Temp/Data.csv', 'r') as input:
    lines = input.readlines()

conversion = '-"/.$'
newtext = '_'
outputLines = []
for line in lines:
    temp = line[:]
    for c in conversion:
        temp = temp.replace(c, newtext)
    outputLines.append(temp)

with open('C:/Temp/Data_out1.csv', 'w') as output:
    for line in outputLines:
        output.write(line + "\n")
于 2013-04-01T20:13:21.593 に答える
0

@Nisan.Hによって指摘されたバグと@dckrooneyによって作成された有効な指摘に加えて、この場合、ファイルがCSVファイルであるという理由だけで特別な方法でファイルを処理する必要はないかもしれません(ただし、以下の私のコメントを参照してください) :

  1. writer.writerow()それぞれがコンマで区切られて書き出される一連の文字列を取る必要があります (こちらを参照)。あなたの場合、単一の文字列を書いています。
  2. このコードは、「C:/Temp/Data.csv」から2 つの方法 (スルーinputとスルー) で読み取るように設定していますlinesが、実際には読み取りのみinputを行います (したがって、コードはファイルを CSV ファイルとして処理しません)。
  3. newtextコードは、その変数の各バージョンに文字を追加して書き出します。したがって、 の最初のバージョンはnewtext1 文字、2 番目は 2 文字、3 番目は 3 文字というようになります。

最後に、CSV ファイルに引用符を含めることができることを考えると、入力ファイルを具体的に CSV として処理して、保持したい引用符を置き換えないようにすることが実際には必要になる場合があります。 CSV ファイルのフィールド内に存在します。その場合、CSV ファイルの各フィールドを個別に処理してから、各行を新しい CSV ファイルに書き出す必要があります。

于 2013-04-01T20:27:34.983 に答える