您好我有一个csv文件,其中有两列,一列有数字,另一列有以下格式的字母:
1234 k
343 o
5687 uiuuo
我想要做的就是用前面的值填充空白行。我已经编写了代码,可以将我的工作保存在一个新的csv中,但是我收到的错误是:
b = w[1]
IndexError: list index out of range
这是我的代码
import csv
with open('col.csv', 'r') as f:
reader = csv.reader(f)
my_list = list(reader)
#print my_list[1]
#x = my_list[1]
#print x[0]
x = 0
for count in my_list:
w = my_list[x]
a = w[0]
b = w[1]
print (a, b)
#print 'a', a , 'b', b
if a == '' and b == '' and x < 3044:
h = x - 1
my_list[x] = my_list[h]
#print 'my_list[x]', my_list[x]
x = x + 1
#print my_list[x]
elif a != '' and b != '' and x < 3044:
my_list[x] = (a,b)
x = x + 1
# print my_list[x]
writer = csv.writer(open('C:/Users/user/Desktop/col2.csv', 'wb'))
#for count in my_list:
data = my_list
for row in data:
writer.writerow(row)
#print count
答案 0 :(得分:1)
当你说
时包含先前值的空行
我假设你想转:
1234 k
343 o
5687 uiuuo
向
1234 k
1234 k
343 o
343 o
5687 uiuuo
您的代码存在很多问题:
import csv
with open('col.csv', 'r') as f:
reader = csv.reader(f)
my_list = list(reader)
如果您已将其评论出来,则无需将其包含在您的问题中
#print my_list[1]
#x = my_list[1]
#print x[0]
x = 0
for count in my_list:
您 知道您的列表不包含计数,对吗?这只是代码所在。不要那样做。此外,如果要枚举列表并获取索引以及值,那就是enumerate
的用途。它应该是for x, value in enumerate(my_list)
w = my_list[x]
a = w[0]
b = w[1]
你的第二行实际上并没有两个元素。这就是你的代码失败的原因。糟糕。
print (a, b)
#print 'a', a , 'b', b
这里的代码是一个热点。你为什么要限制x < 3044
? h
是一些没有意义的随机变量名。不要这样做。
if a == '' and b == '' and x < 3044:
h = x - 1
my_list[x] = my_list[h]
#print 'my_list[x]', my_list[x]
x = x + 1
#print my_list[x]
elif a != '' and b != '' and x < 3044:
my_list[x] = (a,b)
x = x + 1
# print my_list[x]
不要打开这样的文件,它们可能永远不会被刷新到磁盘上。或者整个文件在任何情况下都不会。 始终使用with
块!
writer = csv.writer(open('C:/Users/user/Desktop/col2.csv', 'wb'))
#for count in my_list:
data = my_list
for row in data:
writer.writerow(row)
#print count
所以......这里有一个有趣的假设 - 你的第一行必须不是空的。我的意思是,我想它可以,但是那时你将要写空行,也许你不想要那样。此外,您提供的输入似乎与您正在执行的操作不匹配,因为您没有使用\t
分隔符。
如果你想想你想做什么,你可以很容易地想出这些步骤:
那么那就非常直接了。
import csv
with open('input.csv') as infile, open('output.csv', 'w') as outfile:
reader = csv.reader(infile, delimiter='\t')
writer = csv.writer(outfile)
for row in reader:
writer.writerow(row)
这有效 - 但如果我们有一个空白行,它不会写上一行。嗯。那我们怎么做呢?好吧,为什么不存储前一行?如果当前行为空,我们可以改写前一行。
previous_row = [] # If the first row is empty we need an empty list
# or whatever you want.
for row in reader:
if not row:
writer.writerow(previous_row)
else:
writer.writerow(row)
previous_row = row
如果您想将['', '']
视为空行,您只需要调整代码:
if not row and not all(row):
...
现在,如果该行为空,或者该行包含false-y项,则它也将跳过该行。
答案 1 :(得分:0)
尽量不索引空列表的元素或将它们分配给变量。 在您的情况下,最简单的方法就是克隆一个完整的行。
import csv
with open('col.csv', 'r') as f:
reader = csv.reader(f)
my_list = list(reader)
for i in range(0,len(my_list)):
currentLine = my_list[i]
#Make sure it's not the first line and it's empty, else continue
if not currentLine and i > 0:
my_list[i] =my_list[i-1]
with open('C:/Users/user/Desktop/col2.csv','wb') as f:
writer = csv.writer(f)
for row in my_list:
writer.writerow(row)