3

我有一个 csv 文件,其中包含 324 行和 495 列的值数组。每行和每列的所有值都相同。

我需要拆分这个数组,以便每 10 个值放在一个新行中。因此,对于 324 行中的每一行,将有 49 个完整的列有 10 个值,1 列有 5 个值(495 col / 10 个值 = 49 个新行有 10 个值和 1 个新行有 5 个值)。然后转到下一行,依此类推,共 324 行。

我遇到的问题如下:

  1. line.split(",") 似乎没有做任何事情
  2. line.split 之后的所有内容似乎也没有做任何事情
  3. 我不确定我的 for newrow in range ...是否正确
  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

2 回答 2

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 的倍数。 %可以被认为是“余数”,所以它会newrow在除以时给出余数10。(例如: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]

我当然不是专家,但我希望这会有所帮助!

于 2013-02-11T21:34:50.687 回答
0

好的,我认为这个脚本几乎可以工作。

现在的问题是它在第 49 行之后停止写入 outFile。它使 10 列 49 行,但应该有第 50 行只有 5 列,因为 CSV 文件中的每一行是 495 列。因此,当前脚本将最后 10 个值写入新行 49 次,但它没有得到额外的 5 个。另外,它必须再执行 323 次,因为原始 CSV 文件有 324 行。

所以,我认为现在的问题可能出在最后一个 if 语句中,也许需要一个 else 语句,但我的 elif 语句没有做任何事情。我想说如果列表中的第 6 个值是行尾字符('\n'),然后将列表中的 5 个值写入行尾之前......它不起作用。

感谢到目前为止的所有帮助,我很感激!

这是脚本:

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()
于 2013-02-12T15:47:01.297 回答