2017-03-16 4 views
1

ファブリックでリモートファイルを読み込もうとしています。ファイルがStringIOに正常にダウンロードされています。そのため、新規のために、のファイルをasume聞かせすることは、ローカルにある:PythonのStringIOとcsv.readerのトラブル2.7

fd=StringIO('#test=123\nblabla=456').getvalue()

今、私はコメントを削除すると同時に、テストの値を変更したい:

dict(next(csv.reader([item], delimiter='=', quotechar="'")) for item in next(csv.reader([fd], delimiter='\n', quotechar="'"))) 

私はエラーを取得します:

_csv.Error: new-line character seen in unquoted field - do you need to open the file in universal-newline mode?

しかし、どのように私はユニバーサル改行モードでファイルを開くのですか?

編集:

したがって、私はStringIOを読みました。しかし、私はまた、それを変更しています:csv標準能力の範囲内

content = re.sub(r'(?m)^\#.*\n?', '', fd) # remove lines starting with # 
dict(next(csv.reader([item], delimiter='=', quotechar="'")) for item in next(csv.reader([fd], delimiter='\n', quotechar="'"))) 

答えて

2

滞在は、StringIOファイルの値を得ることはありません。ちょうどそれを巻き戻してcsv.readerに渡し:

fd=StringIO('#test=123\nblabla=456') 

fd.seek(0) # if the file has been written to 
d = dict(next(csv.reader([item], delimiter='=', quotechar="'")) for item in next(csv.reader(fd, delimiter='\n', quotechar="'"))) 
print(d) 

結果:

{'#test': '123'} 

fd.seek(0)が本当にここに必要とされていませんが、fdは、いくつかの呼び出しによってに書き込まれた場合、それが必要です:あなたは巻き戻ししなければなりませんそれを渡すことができるバッファcsv.reader

+0

あなたの答えをありがとう!あなたが実際にfdで何かをしていないときにうまく動作します。しかし、私もそれを解析し、次に、TypeError:解析に予想される文字列またはバッファを取得します。だから私は本当にgetvalue() – gabn88

+1

が必要なので、 'fd.getvalue()'を保持する新しい変数を定義する:done :)しかし、それを構文解析して+ csvに送ることはちょっと変わったようだ。潜在的に複雑な解析をやり直すのではなく、csvモジュールで解析を使用する必要があります。 –

+0

ああ、そうですよ!本当にとても簡単で、難しいと思っていました。 – gabn88