2013-02-11 63 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()