2017-03-16 54 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