问题
我有一个包含大量项目的CSV文件。
第一列可以包含IP地址或随机垃圾。我唯一关心的另一个专栏是第四个专栏。
我编写了下面的代码片段,试图检查第一列是否是IP地址,如果是,则将该内容和第四列的内容并排写入另一个CSV文件。
with open('results.csv','r') as csvresults:
filecontent = csv.reader(csvresults)
output = open('formatted_results.csv','w')
processedcontent = csv.writer(output)
for row in filecontent:
first = str(row[0])
fourth = str(row[3])
if re.match('\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}', first) != None:
processedcontent.writerow(["{},{}".format(first,fourth)])
else:
continue
output.close()
这在一定程度上起作用。但是,在Excel中查看时,两个项目都放在一个单元格中,而不是两个相邻的单元格中。如果我在记事本中打开它,我可以看到每一行都用引号括起来。如果删除这些,Excel将正确显示列。
示例输入
1.2.3.4,rubbish1,rubbish2,reallyimportantdata
所需输出
1.2.3.4 reallyimportantdata - two separate columns
实际输出
"1.2.3.4,reallyimportantdata" - single column
问题
有没有办法捏造format
部分不写出引文?或者,什么是实现我想要做的最好的方法?
我已经尝试写出另一个文件并剥离线条,但是,尽管没有丢失任何错误,但结果是一样的......
答案 0 :(得分:1)
writerow()
获取元素列表并将每个元素写入列中。由于您只为一个列表提供一个元素,因此它将被放入一列中。
相反,请将writerow()
提供给列表:
processedcontent.writerow([first,fourth])
答案 1 :(得分:1)
你考虑过使用熊猫吗?
import pandas as pd
df = pd.read_csv("myFile.csv", header=0, low_memory=False, index_col=None)
fid = open("outputp.csv","w")
for index, row in df.iterrows():
aa=re.match(r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$",row['IP'])
if aa:
tline = '{0},{1}'.format(row['IP'], row['fourth column'])
fid.write(tline)
output.close()
可能有一两个错误,我从here获得了正则表达式。
这假设csv的第一行具有可以引用的标题。如果没有,则可以使用header = None
并使用iloc
考虑一下你可以在dataFrame上运行正则表达式,将第一列和第四列复制到新的dataFrame并在pandas中使用to_csv
方法。