2012-10-11 72 views
0

我是python中的新手,我有一個運行代碼,它從Web服務中提取數據並將其放入列表中,並將其寫入文本文件中。當我運行這段代碼並打開文本文件時,數據是連續的。我需要在文本文件的每一行中都有這樣的內容,它將顯示5個元素,並將轉到下一行並寫入下一個5個元素,依此類推。希望你能幫助我解決這個問題或者以其他方式提出建議來做到這一點。這是代碼。在python中格式化/顯示列表

f = open("test.txt", "w") 

for item in test: 
    f.write("%s | " % item) 
f.close() 

結果看起來是這樣的:

data1, data2, data3, data4, data5, data6, data7, data8...................... 

它應該是這種格式:

data | data2 | data3 | data4 | 
data5 | data6 | data7 | data8 | 
data9 | data10 | data11 | data12 | 

我希望我能有你的投入。謝謝!

+0

寫入之前e文件,用空格或空白替換所有特殊字符。 str.replace('[],',''),或者你可以使用基本上做同樣工作的re.sub函數。 – ronak

+0

檢查一下。這應該幫助你格式化輸出http://stackoverflow.com/questions/12831438/text-file-data-parsing-lines-and-output-as-columns – ronak

+1

'list_s = list([...])' - 您不需要額外的list()調用,因爲您已經使用[list comprehension](http://docs.python.org/tutorial/datastructures.html#list-comprehensions)創建了一個列表。你可以使用'f.writelines(list_s)'來一次寫入整個列表,而不必循環遍歷它。 –

回答

1
for i, item in enumerate(test): 
    if i and i % 4 == 0: 
     f.write("\n") 
    f.write("%-9s| " % item) 
+0

非常感謝!這是我正在尋找的格式化方法。 –

+0

我可以爲每列設置空格嗎?如果你有這個想法。謝謝! –

+0

作爲Alex L的觀點,請使用string.format,如下所示:'[f.write('{0:9s} | {1:9s} | {2:9s} | {3:9s} | \ n'.format (0,len(test),4)]' – Rejown

0

你叫什麼「特殊字符」?你有什麼數據編碼?在繼續之前,瞭解什麼是編碼,什麼是unicode,以及您所遇到的問題和數據不僅限於主要用於英語的26個字母,這一點非常重要。 Check this article瞭解它。

也就是說,Python可以將數據編碼爲您選擇的編碼 - 甚至是ASCII,所以您只能得到32-127個字符,並且根本沒有「陌生人」字符 - 比如ã,ç,É或者您可以使用utf-8編碼您的數據,以便能夠使用我們在地球周圍使用的全部字符。但是,如果您只能對Unicode數據進行「編碼」(如果您使用編碼字符串方法,則Python會嘗試隱式地將字節字符串轉換爲unicode) - 因此無論如何您必須知道數據源的編碼。一旦數據解碼爲unicode(在正在運行的程序中),您可以將其編碼爲所需的輸出(例如,ASCII或「quopri_codec」),並將「errors」關鍵字參數設置爲「忽略」或「xmlcharrefreplace」編碼。

爲了更好地理解它,從Python的

檢查 codecs documentation

例如,假設您輸入的數據在iso8859_15 incoded(又名LATIN1或CP1252放,或採取2條字符的定義),一個第二,你真的要打壓任何非英文字符:

s = client.service.GetData('data1') 
s = s.decode("iso88159_15").encode("ASCII", errors="ignore") 
sr = '<root>%s</root>' % s 
root = ET.fromstring(sr) 

OTOH,因爲你是編碼XML,XML將引用的字符,你不希望 對付不應該傷害 - (如可能編碼成UTF-8就不會傷害):

s = s.decode("iso88159_15").encode("ASCII", errors="xmlcharrefreplace") 
+0

我提到的特殊字符是[],'等列表中的字符,只是想在列表中提取數據本身並將其放入文本文件中。感謝您的見解。 –

3

那些字符不是的列表中,他們的都是的列表。

>>> print ''.join(['foo', 'bar', 'baz']) 
foobarbaz 
+0

我明白了你的觀點,但我正在弄清楚如何使用上面使用的代碼去除文本文件中的那些字符。感謝您的信息。 –

+2

您是否嘗試過我所展示的內容? –

+0

是的我試過了,它產生了一個錯誤,因爲列表中的某些元素沒有任何價值。感謝您的幫助 –

1

正如@Ignacio所說,您需要更改打印列表的方式。

for line in list_s: 
    # f.write("%s\n" % line) 
    f.write(''.join(line)) 

如果您想在表格中顯示,你可以格式化每一行是這樣的:

>>> print '{0:10s} {1:10s} {2:10s}'.format('foo', 'bar', 'baz') 
foo  bar  baz  

或者用線:

>>> print '{0:10s} | {1:10s} | {2:10s}'.format('foo', 'bar', 'baz') 
foo  | bar  | baz  

見Python的Input and Output documentation爲更多信息