如何使用Python内置的.csv写入模块替换列?
我需要在一个很大的Excel .csv文件中对某一列的URL进行查找和替换。因为我刚开始自学一种脚本语言,所以我想试着用Python来实现这个解决方案。
我在“替换”这部分遇到了困难。我看过官方的csv模块文档,了解如何使用写入器,但里面的例子对我来说不够清楚(是的,我学得比较慢)。所以,我想问一下:如何用写入器对象遍历csv文件的每一行呢?
另外,提前为我的代码不够优雅道歉,我还在学习中 :)
import csv
csvfile = open("PALTemplateData.csv")
csvout = open("PALTemplateDataOUT.csv")
dialect = csv.Sniffer().sniff(csvfile.read(1024))
csvfile.seek(0)
reader = csv.reader(csvfile, dialect)
writer = csv.writer(csvout, dialect)
total=0;
needchange=0;
changed = 0;
temp = ''
changeList = []
for row in reader:
total=total+1
temp = row[len(row)-1]
if '/?' in temp:
needchange=needchange+1;
changeList.append(row.index)
for row in writer: #this doesn't compile, hence the question
if row.index in changeList:
changed=changed+1
temp = row[len(row)-1]
temp.replace('/?', '?')
row[len(row)-1] = temp
writer.writerow(row)
print('Total URLs:', total)
print('Total URLs to change:', needchange)
print('Total URLs changed:', changed)
3 个回答
0
一旦你把csv文件的数据放进一个大列表里,替换列表中的某一列有个简单的方法,就是先把这个矩阵转置一下,替换掉对应的行,然后再把它转置回来:
mydata = [[1, 'a', 10], [2, 'b', 20], [3, 'c', 30]]
def transpose(matrix):
return [[matrix[x][y] for x in range(len(matrix))] for y in range(len(matrix[0]))]
transposedData = transpose(mydata)
print transposedData
>>> [[1, 2, 3], ['a', 'b', 'c'], [10, 20, 30]]
editedData = transposedData[:2] + [50,70,90]
print editedData
>>> [[1, 2, 3], ['a', 'b', 'c'], [50, 70, 90]]
mydata = transpose(editedData)
print mydata
>>> [[1, 'a', 50], [2, 'b', 70], [3, 'c', 90]]
1
你只需要一个循环,同时进行读取和写入。如果你的替换操作只影响一行数据,那就不需要对数据进行两次循环。
for row in reader:
total=total+1
temp = row[len(row)-1]
if '/?' in temp:
temp = row[len(row)-1]
temp.replace('/?', '?')
row[len(row)-1] = temp
writer.writerow(row)
这只是用来说明循环的,替换的代码是否能这样工作我不太确定。
6
你遇到错误的原因是因为写入器没有数据可以处理。你需要给它提供数据——通常来说,你应该有一个列表或者生成器,用来产生要写入的行。
我建议把这两个循环合并在一起,像这样:
for row in reader:
row[-1] = row[-1].replace('/?', '?')
writer.writerow(row)
这样一来,你甚至不需要 total
、needchange
和 changeList
这些变量了。(里面有很多优化的地方,我很遗憾没有时间详细解释,但我会尽量在后面补充这些信息)