用于导出csv的Python 3脚本

时间:2016-12-21 08:09:45

标签: python-3.x export-to-csv

您好我有一个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

2 个答案:

答案 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 < 3044h是一些没有意义的随机变量名。不要这样做。

    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)