我对Python很陌生,并整理了一个脚本来解析csv并最终将其数据输出到重复的html表中。
我的大部分都在工作,但是我还有一个奇怪的问题我无法修复。我的脚本将找到最后一列的索引,但不会打印出该列中的数据。如果我在末尾添加另一列,即使是空列,它也会打印出前一列中的数据 - 因此该列的内容不会出现问题。
代码的简陋(但仍然脾气暴躁)版本:
import os
os.chdir('C:\\Python34\\andrea')
import csv
csvOpen = open('my.csv')
exampleReader = csv.reader(csvOpen)
tableHeader = next(exampleReader)
if 'phone' in tableHeader:
phoneIndex = tableHeader.index('phone')
else:
phoneIndex = -1
for row in exampleReader:
row[-1] =''
print(phoneIndex)
print(row[phoneIndex])
csvOpen.close()
my.csv
stuff,phone
1,3235556177
1,3235556170
输出
1
1
相同的脚本,对CSV文件的小改动:
my.csv
stuff,phone,more
1,3235556177,
1,3235556170,
输出
1
3235556177
1
3235556170
我通过Idle 3.4.3使用Python 3.4.3
我在mysql直接生成的CSV中遇到了同样的问题,我先在Excel中打开然后重新保存为CSV的CSV,以及我在Notepad ++中编辑过的那些保存为CSV。
我尝试在open函数(r,rU,b等)中添加了几种不同的模式,并且它没有任何区别或给了我一个错误(例如,它没有' b& #39;)
我的解决方法只是在末尾添加一个额外的列,但由于这是一个经常使用的脚本,如果它正常工作,它会好得多。
提前感谢您的帮助。
答案 0 :(得分:3)
row[-1] =''
CSV阅读器会返回一个表示文件中行的列表。在此行中,您将列表中的最后一个值设置为空字符串。然后你打印它。如果您不希望将最后一列设置为空字符串,请删除此行。
答案 1 :(得分:0)
如果您知道它是最后一列,您可以对它们进行计数,然后使用该值减去1.同样,如果您知道它将永远是"电话",您可以使用字符串比较方法。我建议如果您使用字符串比较,将csv中的值转换为小写,这样您就不必担心大小写。
在下面的代码中,我创建了一些函数,展示了如何使用这两种方法。
import os
import csv
os.chdir('C:\\temp')
csvOpen = open('my.csv')
exampleReader = csv.reader(csvOpen)
tableHeader = next(exampleReader)
phoneColIndex = None;#init to a value that can imply state
lastColIndex = None;#init to a value that can imply state
def getPhoneIndex(header):
for i, col in enumerate(header): #use this syntax to get index of item
if col.lower() == 'phone':
return i;
return -1; #send back invalid index
def findLastColIndex(header):
return len(tableHeader) - 1;
#@ methods to check for phone col. 1. by string comparison
#and 2. by assuming it's the last col.
if len(tableHeader) > 1:# if only one row or less, why go any further?
phoneColIndex = getPhoneIndex(tableHeader);
lastColIndex = findLastColIndex(tableHeader)
for row in exampleReader:
print(row[phoneColIndex])
print('----------')
print(row[lastColIndex])
print('----------')
csvOpen.close()