2016-05-26 11 views
0

ファイルから非アスキー文字を削除しようとしています。私は実際にこれらの文字を含むテキストファイルを変換しようとしています(例えば、hello§,å½¢æäº†å¯¹æ¯ "ã€、花å)をcsvファイルに変換します。Pythonを使用してcsvファイルから非アスキー文字を削除する

しかし、私はこれらの文字を繰り返し処理することができないため、それらを削除したい(つまり、切り捨てるかスペースを入れる)必要があります。ここにコードがあります(さまざまな情報源から調査して集めました)

コードの問題は、スクリプトを実行した後にcsv/txtファイルが更新されていないことです。それは文字がまだそこにあることを意味します。もうこれ以上やり直す方法が全くわからない。日:(

調査親切にあなたの助けをお願い申し上げ

import csv 

txt_file = r"xxx.txt" 
csv_file = r"xxx.csv" 

in_txt = csv.reader(open(txt_file, "rb"), delimiter = '\t') 
out_csv = csv.writer(open(csv_file, 'wb')) 
for row in in_txt: 
    for i in row: 
     i = "".join([a if ord(a)<128 else''for a in i]) 

out_csv.writerows(in_txt) 
+0

'in_txt'を更新することはないので(csvに出力している内容は' ** '**のコピーです)、' in_txt'の元の行へのポインタではありません – Torxed

+2

文字列Pythonでは不変であり、代入はその場で値を変更せず、名前を再割り当てします現在割り当てられているオブジェクトを参照します。 @Torxedが指摘したように、あなたは実際に何かを更新することはありません。 –

+0

ちょっと@Torxedとilja、愚かな音で申し訳ありませんが、私は '更新'して、私はすでにin_txtを更新したと思った? in_txtの更新方法を聞かれますか? – Bread

答えて

3

変数割り当てが魔法のように元のソースに転送されていない、あなたの変更された行の新しいリストを構築する必要があります!

import csv 

txt_file = r"xxx.txt" 
csv_file = r"xxx.csv" 

in_txt = csv.reader(open(txt_file, "rb"), delimiter = '\t') 
out_csv = csv.writer(open(csv_file, 'wb')) 
out_txt = [] 
for row in in_txt: 
    out_txt.append([ 
     "".join(a if ord(a) < 128 else '' for a in i) 
     for i in row 
    ] 

out_csv.writerows(out_txt) 
関連する問題