我需要在巨大的Excel .csv文件中进行查找和替换(特定于一列URL)。由于我正处于尝试自学脚本语言的初级阶段,我想我会尝试在python中实现该解决方案。
我遇到了解决方案“替换”部分的问题。我已经阅读了关于如何使用作者的official csv module documentation,但对我来说还没有一个明确的例子(是的,我很慢)。那么,现在问题是:如何使用编写器对象迭代csv文件的行?
P.S。为笨拙的代码提前道歉,我还在学习:)。
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)
答案 0 :(得分:6)
您收到错误的原因是编写器没有要迭代的数据。你应该给它提供数据 - 大概是,你有某种列表或生成器可以产生要写出的行。
我建议只组合两个循环,如下:
for row in reader:
row[-1] = row[-1].replace('/?', '?')
writer.writerow(row)
由此,您甚至不需要total
,needchange
和changeList
。 (在那里有很多优化,我很遗憾没有时间解释,但我会看看我是否可以在以后编辑该信息)
答案 1 :(得分: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)
这只是为了说明循环,不确定替换代码是否会像这样工作。
答案 2 :(得分: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]]