我尝试在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文件显示如下: -
我做错了什么?
答案 0 :(得分:4)
您don't want将print
语句写入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;
主要区别在于输出文件是在读取输入文件时写入的。考虑到缓冲,性能可能稍微慢一些,但对于大量数据可能会派上用场。