将print语句写入csv文件

时间:2015-06-04 21:35:21

标签: python csv

我尝试在csv文件中编写以下python程序的print语句。

import optparse
import datetime
import csv
file_name='sample.txt'
with open(file_name,'rb') as f:               
    reader = csv.reader(f,delimiter=",")                                              
    #headers = reader.next()
    for row in reader:

        row[0] = row[0].zfill(6) 
        row[2] = row[2].zfill(6)
        row[3] = row[3].zfill(6)
        row[4] = row[4].zfill(6)
        row[1] = row[1][5:7] + "-" + row[1][8:10] + "-" + row[1][:4]
        p = row[0],row[1],row[2],row[3],row[4]
        print p
with open('names.csv', 'wb') as ofile:
    writer = csv.writer(ofile)
    writer.writerow(p)

输出如下: -

C:\Python27\office>python python_poc.py
('User_ID', '--Date', '0Num_1', '0Num_2', 'Com_ID')
('000101', '04-13-2015', '000012', '000021', '001011')
('000102', '04-03-2014', '000001', '000007', '001002')
('000103', '06-05-2013', '000003', '000004', '000034')
('000104', '12-31-2012', '000004', '000009', '001023')
('000105', '09-09-2011', '000009', '000005', '000104')

但我的输出csv文件显示如下: - enter image description here

我做错了什么?

4 个答案:

答案 0 :(得分:4)

don't wantprint语句写入CSV文件。问题是你在每一行之后都会覆盖p,所以只保存最后一行。这不太难解决:

p = []
for row in reader:
    ...
    p.append(row[:5])
with open('names.csv', 'wb') as ofile:
    writer = csv.writer(ofile)
    for row in p:
        writer.writerow(row)

或者清理标题行:

with open('names.csv', 'wb') as ofile:
    writer = csv.writer(ofile)
    writer.writerow([row[0], row[1].lstrip('-'), row[2].lstrip('0'), row[3].lstrip('0'), row[4]])
    for row in p[1:]:
        writer.writerow(row)

或者,更好(但没有标题行清理):

with open(file_name,'rb') as f, open('names.csv', 'wb') as ofile:
    writer = csv.writer(ofile)
    ...
    for row in reader:
        ...
        writer.writerow(row[:5])

正如您所看到的,以编程方式清理标头可能会变得混乱(我甚至不知道清理实现是否正确 - 如果您获得__Date-+-Date的标头单元格会怎么样?而不是--Date?)。除非您尝试自动生成此文件作为计划任务的一部分,否则在Notepad / Excel / etc中打开文件会更有意义。并手动清理标题行。

答案 1 :(得分:0)

您的电子表格应用程序正在格式化数据。在文本编辑器中打开CSV,您将看到预期的数据。

=== UPDATE ===
我看到的问题是格式不正确的数据,因此我的上述评论 - 这是正确的。假设您正在查询丢失的记录,那么您的逻辑很接近,@ TigerhawkT3就可以得到答案。

答案 2 :(得分:0)

我假设您的问题与数据的显示方式有关,而不是只打印出一行。如果这个假设是错误的,那么请说明CSV的显示方式到底出了什么问题。

看起来问题是您用来查看.csv文件的程序。如果你想看看原始的.csv是什么样的,你应该在gedit或Notepad等文本编辑器中打开它。

当您在电子表格程序中打开.csv文件时,它将解释并显示程序的.csv输出,但它会根据它自己的默认设置格式化每个单元格。此外,大多数电子表格程序允许您选择如何解释CSV文件中的分隔符,这将改变您的所有数据是否正确导入/显示。

答案 3 :(得分:0)

鉴于@ TigerhawkT3已经正确识别了问题(我发现其解决方案非常出色),让我建议一个替代方案,它遵循您最初的思路:

label1.Text = textBox1.Text;

主要区别在于输出文件是在读取输入文件时写入的。考虑到缓冲,性能可能稍微慢一些,但对于大量数据可能会派上用场。