2013-10-11 128 views
0

我的代碼按照我想要的操作(僅保存了.csv中的第一列),但是當我將它寫回到.csv時, csv,我會在每個單元格中獲得一個字母,而不是第一列中的所有字。如何將.csv字符串寫入單個單元格而不是每個單元格的一個字母

def del_col(in_path): 
    # read file into memory 
     file_obj = open(in_path, 'rb') 
     reader = csv.reader(file_obj, delimiter='\t') 
     data = [] 
     for row in reader: 
      column = str.split(row[0],',') 
      data.append(column[0]) 
     print row 

     file_obj.close() 

     conf = raw_input('Delete Status Column? (Y|N): ').upper()[0] 

     if conf == 'Y': 
      # write data to file 
      file_obj = open(in_path, 'wb') 
      writer = csv.writer(file_obj) 
      writer.writerows(data) 
      file_obj.close() 

我懷疑我的底部寫代碼段作爲需要改變的部分。任何關於命令的想法都會將我的話保存在一個單元格中,而不是將其切斷?先謝謝您的幫助。

+0

快速的方法是做一個類似於'在閱讀器中的行「的循環,從那一點改變列中的值。 – ipinak

+1

我覺得'column'實際上是一個字符串,所以當你做'column [0]'時,你會得到每個字符串的第一個字母 – TankorSmash

+0

@TankorSmash的確,你只需要一個字符。 – ipinak

回答

1

的問題是,在數據中的每一行是一個字符串,但writerows預計串序列的序列。所以,它將每個字符串解釋爲1個字符的字符串序列。

如果你真的只想寫出列[0]每行,使每行一個字符串列表,像這樣:

data.append([column[0]]) 

如果你想寫柱而出[0]加一些其他的東西...然後它不清楚其他的東西是什麼,但你會構建一個列[0]列表和其他東西,並將其附加到數據。

1

writerows需要序列列表。對於每個序列,它將序列中的每個條目寫入不同的列。你給它一個字符串列表,什麼時候得到你想要的行爲,你應該給它一個字符串列表的列表。或者元組,無論哪一個。

最小修改你的代碼,以獲得正確的行爲是:

data.append(column[:1]) 

有很多其他的東西我會改變,但應該得到它的工作。

至於我還會改變什麼 - 在寫出之前,您不需要加載您的data列表的內容。相反,您可以將產生正確內容的迭代器傳遞給csv.writer類。我看到在這裏你正在重寫輸入文件 - 我一般喜歡隨時寫入臨時文件,然後在成功時將其移動到磁盤上,或者只是以不同的名稱查找輸出文件。

此外,在本例中,您實際上並不需要csv編寫器,因爲您只寫過一列。一個簡單的文件句柄也可以工作。從上下文中我假設這個示例不完整,並且基於輸入您可能不想刪除輸入行的某些部分。儘管如此,我不能告訴你想輸出的是不是'Y'的輸入值。

str進口不存在,所以我不能完全肯定你與str.split叫什麼,但如果它是內置的string模塊的功能這主要是過時的。相反,split現在是一個字符串對象的方法。

我會做這樣的事情:

def del_col(in_path): 
    conf = raw_input('Delete Status Column? (Y|N): ').upper()[0] 
    out_path = in_path + '.out' 
    with open(in_path, 'rb') as input_file, open(out_path, 'wb') as output_file: 
     reader = csv.reader(input_file, delimiter='\t') 
     if conf == 'Y': 
      # no need for a csv writer when writing just a single string per line 
      output_file.writelines(row[0].split(',')[0] + '\n' for row in reader) 
     else: 
      # not sure what you want here; possibly a writer object? 
      # actual logic to write the output file goes here in place of the pass 
      pass 
    os.rename(in_path, in_path + '.input') 
    os.rename(out_path, in_path) 
+0

我對你想要改變的其他想法感興趣,我是一個新的python用戶,所以我的代碼非常笨重,可能不重複,因爲你可以告訴 – gigawatts

+0

最重要的是你可能不想閱讀整個文件在開始寫出之前進入內存。我會編輯一個我如何將這個問題寫入我的答案的版本。 –

相關問題