将特定列写入输出文件然后在Excel中打开时出现Python CSV格式问题

时间:2017-08-15 14:51:31

标签: python excel csv formatting

问题

我有一个包含大量项目的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部分不写出引文?或者,什么是实现我想要做的最好的方法?

我已经尝试写出另一个文件并剥离线条,但是,尽管没有丢失任何错误,但结果是一样的......

2 个答案:

答案 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方法。