2013-02-11 60 views
3

我有一個帶有324行和495列值的csv文件。每行和每列的所有值都相同。將CSV轉換爲txt並使用Python每10個值開始新行

我需要將此數組分開,以便每10個值都放在一個新行中。因此,對於324行中的每一行,將會有49個滿列10個值和1列5個值(495列/ 10個值= 49個新行10個值和1個新行5個值)。然後轉到下一行,依次類推324行。

列示如下我遇到麻煩:

  1. line.split(「」)似乎並沒有被做任何事情
  2. 一切line.split似乎後不做任何事
  3. 我不知道我的新的範圍...是正確的
  4. 我還沒有把輸出寫入文本文件,但我認爲它應該outFile.write(東西在這裏,不知道是什麼)
  5. 我把「\ n」打印後聲明,但它只是打印出來

我是一個初學者程序員。

腳本:

import string 
import sys 

# open csv file...in read mode 
inFile= open("CSVFile", 'r') 
outFile= open("TextFile.txt", 'w') 


for line in inFile: 
    elmCellSize = line.split(",") 
    for newrow in range(0, len(elmCellSize)): 
     if (newrow/10) == int(newrow/10): 
      print elmCellSize[0:10] 

outFile.close() 
inFile.close() 
+4

使用http://docs.python.org/2/library/csv.html閱讀CSV。找到一些例子並研究它們。 – piokuc 2013-02-11 20:43:16

+0

我試過這個,但它仍然沒有分隔逗號:與open('elm_4feb13_ascii.csv','rb')inFile: reader = csv.reader(inFile,delimiter =',') : if row == int(row/10): print row break – jpspeeddemon 2013-02-11 21:16:22

+0

您確定輸入的CSV文件是逗號分隔的嗎? – piokuc 2013-02-11 21:27:07

回答

0

你真正應該使用CSV模塊,但我可以給反正一些建議。

你遇到的一個問題是,當你說print elmCellSize[0:10]時,你總是選擇前10個元素,而不是最近的10個元素。根據你想如何做到這一點,你可以保留一個字符串來記住最近的10個元素。在提到可以使用代碼修復的一些問題之後,我會在下面展示一個示例。

首先注意到line.split(',')返回一個列表。所以你選擇的變量名稱elmCellSize有點誤導。如果你說lineList = line.split(',')它可能更有意義?或者如果你說lineSize = len(line.split(','))並使用它?

另外(雖然我對Python 2.x一無所知)我認爲xrange是Python 2.x的一個函數,它比range更有效,儘管它的工作方式完全相同。

與其說if (newrow/10) == int(newrow/10)的,你其實可以說if index % 10 == 0,以檢查是否指數是10 %倍數可以被看作是「剩餘」,所以當10分它將給的newrow剩餘部分。 (例如:5%10 = 5; 17%10 = 7; 30%10 = 0)

現在不是打印[0:10],它總是打印前10個元素,而是想從當前索引打印返回10空間。所以你可以說print lineList[index-10:index]爲了打印最近的10個元素。

在最後,你會碰到這樣的

... 
lineList = line.split(',') # Really, you should use csv reader 
# Open the file to write to 
with open('yourfile.ext', 'w') as f: 
    # iterate through the line 
    for index, value in enumerate(lineList): 
     if index % 10 == 0 and index != 0: 
      # Write the last 10 values to the file, separated by commas 
      f.write(','.join(lineList[index-10:index])) 
      # new line 
      f.write('\n') 
      # print 
      print lineList[index-10:index] 

我當然不是專家,但我希望這有助於!

+0

'range(1,n)'給出1到n-1。 '範圍(n-1)'給出0到n-2。包含起始值,但不包括停止值。 – 2013-02-11 22:23:03

+0

yourfile.ext應該是textFile.txt嗎? – jpspeeddemon 2013-02-11 22:23:15

+0

仍然有問題,儘管工作,雖然,感謝您的意見 – jpspeeddemon 2013-02-11 23:10:21

0

好吧,這個腳本幾乎可以工作,我想。

現在的問題是,它會停止在第49行之後寫入outFile。它爲49行創建10列,但應該只有第5行,只有5列,因爲CSV文件中的每行都是495列。因此,當前腳本將最後10個值寫入到新行中49次,但它沒有獲得額外的5次。另外,它必須再做323次,因爲原始CSV文件有324行。

因此,我認爲現在的問題可能在最後一條if語句中,也許需要else語句,但是我的elif語句沒有做任何事情。我想說的是,如果列表中的第6個值是行尾字符('\ n'),那麼將5個值寫入列表prioir到行尾......它不起作用。

感謝所有幫助到目前爲止,我感謝它!

下面是腳本:

import string 
#import sys 
#import csv 

# open csv file...in read mode 
inFile= open("CSVFile.csv", 'r') 
outFile= open("TextFile.txt", 'w') 



for line in inFile: 
    lineList = line.split(',') # Really, you should use csv reader 
# Open the file to write to 
    with open('outFile', 'w') as outFile: 
     # iterate through the line 
     for index, value in enumerate(lineList): 
      if index % 10 == 0 and index != 0: 
       # Write the last 10 values to the file, separated by space 
       outFile.write('\t'.join(lineList[index-10:index])) 
       # new line 
       outFile.write('\n') 
       # print 
       print lineList[index-10:index] 
elif lineList[6] == '\n': 
      # Write the last 5 values to the file, separated by space 
       outFile.write(' '.join(lineList[index-5:index])) 
       # new line 
       outFile.write('\n') 
       # print 
       print lineList[index-:index] 

outFile.close() 
inFile.close()