2013-10-03 35 views
0

我是新來的Python,我試圖把其具有以下格式數據的幾個文本文件:的Python - 寫入CSV文件吐出所有文字到一個單元格

TIME_STAMP時間WORD1 P1 WORD2 p2 ....

並將數據寫入CSV文件。對於我寫入的每一行,我還想包括從中獲取該行的文件的名稱。

我的問題是,我正在執行的代碼似乎將所有文本寫入一個單元格。當我使用LibreOffice打開CSV文件時,它會顯示垃圾字符,說明它無法正確顯示數據,因爲每個單元格的字符數上限已超過。

我在做什麼錯?

import csv, os 

path = "./TRIAL with CSV" 
all_the_files = os.listdir(path) 

for each_file in all_the_files: 
    file = os.path.join(path, each_file) 
    ifile = open(file, "rb") 
    reader = csv.reader(ifile) 
    ofile = open('CSVtrial.csv', "a") 
    writer = csv.writer(ofile, delimiter='\t', quoting=csv.QUOTE_MINIMAL) 

    for row in reader: 
     writer.writerow([each_file,row]) 


ifile.close() 
ofile.close() 

編輯:我不認爲我可以在這裏上傳文件,而是一個樣本輸入文件將是具有如下的.txt文件:

186.860 0.060(01)0.89221220公頃( 01)0.04941113啊(01)0.04552169 OO(01)0.01065865 O(01)0.00219633

187.110 0.410 bongga(01)1.00000000

187.520 0.349納曼(01)0.99999601

(01)0.00179689 gyanan(01)0.00139249 diyan(03)0.00082159

有大約50,000個這樣的.txt文件,我是試圖將其編譯爲單個CSV文件,以便於分析數據。

這是一種錯誤的截圖,我得到當我嘗試查看LibreOffice的CSV文件 - http://i.imgur.com/jvsvxrx.png?1

現在我已經放棄了這個和我只是想在VIM工作。如果任何人有關於如何將這些.txt文件編譯爲電子表格這樣可以更容易地分析數據的其他建議,我將不勝感激。

+0

你到底想幹什麼?現在你正在從csv中的其他文件轉儲內容。 – RickyA

+0

@RickyA,是的,這正是我想要做的 – ubuntunoob

+0

@Alvaro,我能夠在vim中查看文件。我沒有想過使用不同的分隔符。有沒有辦法在我的代碼中做到這一點?謝謝 – ubuntunoob

回答

0

首先,與您的問題無關:您確定要製表符分隔符嗎?也許一個逗號分隔會更好的輸出。其次,它看起來像您的輸入文件是空格分隔,但您創建與默認COMMA分隔的讀者。你可能想嘗試在一個分隔符傳:

reader = csv.reader(ifile, delimiter=' ') 

不知道有沒有什麼幫助,一些樣品的數據可能是有用的,所以我可以在這裏淤泥與它周圍。

編輯:我也注意到,你正試圖將文件連接成單個文件?我在這個假設中糾正了嗎?爲此,我可能會使用其他(即unix)工具,這些工具可以更快地完成任務。如果你的目標是在python中做些有趣的事情,我的建議可能是在循環之外聲明一個writer,而不是用append模式重新打開同一個文件。

EDIT2:當然

writer = csv.writer(open('CSVTrial.csv', 'w'), delimiter='\t', quoting=csv.QUOTE_MINIMAL) 
for each_file in all_the_files: 
    file = os.path.join(path, each_file) 
    with open(file, "rb") as ifile: 
     reader = csv.reader(ifile, delimiter=" ") 
     for row in reader: 
      writer.writerow([each_file] + row) 
ofile.close() 

公告稱,與讀者文件中的語句是爲了避免在明確的close():不知道更多關於你的代碼,我可能如下接近它文件。作者可以有一個明確的關閉,或者你可以使用相同的處理。即使發生異常,輸入文件也保證關閉也很好。你必須確保輸出文件也關閉,使用一些嘗試...趕上...終於

希望這有助於!

+0

謝謝@mlnyc,我嘗試了一些東西,並且我意識到我的輸入文件是製表符分隔的。我試着像你說的那樣在閱讀器中傳遞分隔符,並在輸出中將分隔符更改爲逗號。這些組合沒有任何區別。我仍然可以在vim中看到輸出很好,但是在LibreOffice中,它仍然給我1個單元格中的垃圾字符。 我應該提供什麼樣的樣本數據?文件中的文本行? – ubuntunoob

+0

我認爲文件中的文本行是一個好的開始。你也可以在寫出之前打印這行,以確保它被正確解析。可能還有其他的問題,但沒有進一步的信息,我不知道如何診斷他們......我做了一個完整的例子,如果它有幫助 – mlnyc

+0

@ubuntunoob我會首先列出所有我認爲是真實的事情。例如,假設可能是:輸入文件全部打開正確,或者閱讀器將所有輸入解析爲列表。然後驗證每個假設是否正確。編程正在做假設,調試正在驗證你的假設:) – mlnyc

0

嘗試使用簡單的文本編輯器打開文件..可能問題不在您的代碼中。一些電子表格應用程序使用「,」作爲分隔符。其他人使用「;」甚至「」或標籤。 如果文件看起來像什麼它應該嘗試使用不同的分隔

3

假設分隔符是正確的,這看起來錯誤:

for row in reader: 
    writer.writerow([each_file,row]) 

,因爲這將創建一個行正好用兩個列,其中的第二個單元格將包含整個原始行,序列化。

應該是相當:

for row in reader: 
    writer.writerow([each_file] + row) 
+0

感謝您的建議。我做了更正。它現在看起來更加漂亮,但我仍然在LibreOffice中看到同樣的問題。所有數據仍然只進入1個單元格。 – ubuntunoob

+0

@ubuntunoob你能分享一個重現問題的例子輸入文件嗎? – bereal

+0

用樣本輸入文件@bereal編輯原始文章 – ubuntunoob

相關問題