我有一个csv文件,其值为324行和495列。每行和col的所有值都是相同的。
我需要拆分这个数组,以便每10个值放入一个新行。因此,对于324行中的每一行,将有49个具有10个值的完整列和具有5个值的1个列(495个col / 10个值= 49个具有10个值的新行和1个具有5个值的新行)。然后转到下一行,依此类推324行。
我遇到的麻烦如下:
我是初学程序员。
脚本:
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()
答案 0 :(得分: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]
我当然不是专家,但我希望这有帮助!
答案 1 :(得分:0)
好吧,我想这个脚本几乎可以工作。
现在的问题是它在第49行之后停止写入outFile。它为49行创建了10列,但是应该有第50行只有5列,因为CSV文件中的每一行都是495列。因此,当前脚本将最后10个值写入新行49次,但它没有得到额外的5.另外,由于原始CSV文件有324行,因此必须再执行323次。
所以,我认为问题现在可能在最后的if语句中,可能需要else语句,但我的elif语句没有做任何事情。我希望它说如果列表中的第6个值是行尾字符('\ n'),那么将列表prioir中的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()