2015-06-04 4 views
1

Я пытаюсь написать инструкцию печати следующей программы python в файле csv.Запись инструкции печати в файл csv

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

Что это такое, что я делаю неправильно?

ответ

3

Вы отправили 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. и вручную очистите строку заголовка.

+0

Это сработало! Как избавиться от - in '--Date' и 0 в '0Num_1'? – satyaki

+0

@satyaki: str.replace (old, new [, max]) должен помочь вам с заменой '--Date' и' 0Num_1' ... в качестве примера, '' --Date'.replace ('-' , '') ' – user1801810

0

Приложение электронной таблицы форматирует данные. Откройте CSV в текстовом редакторе, и вы увидите данные, как ожидалось.

=== UPDATE ===
Проблема, которую я видел, была плохо отформатирована, поэтому мой комментарий выше - это правильно. Предположим, что вы интересуетесь отсутствующими записями, тогда ваша логика близка, и на это отвечает TigerhawkT3.

+0

Это не проблема. – TigerhawkT3

0

Я предполагаю, что ваш вопрос связан с тем, как отображаются данные, а не только с одной строкой. Если это предположение неверно, пожалуйста, уточните, что именно не так, как отображается CSV.

Похоже, проблема связана с программой, которую вы используете для просмотра CSV-файла. Если вы хотите посмотреть, как выглядит необработанный .csv, вы должны открыть его в текстовом редакторе, таком как gedit или Notepad.

Когда вы открываете CSV-файл в программе для работы с электронными таблицами, он будет интерпретировать и отображать вывод .csv вашей программой, но он будет форматировать каждую ячейку в соответствии с ее собственными настройками по умолчанию. Кроме того, большинство программ электронных таблиц позволяют вам выбирать, как интерпретировать разделители в файле CSV, что изменит, будут ли все ваши данные импортированы/отображены правильно.

+0

Я думаю, что разумно ясно, что проблема является неполным файлом. – TigerhawkT3

+0

Ну, это двое из нас, которые не совсем согласны с вами в отношении ясности сообщения ... иногда люди не публикуют достоверные данные/образцы/детали/и т. Д., И люди интерпретируют информацию по-разному. – user1801810

+0

Если вы знаете обо всех проблемах как потенциально являющихся проблемой, я просто удивлен, что вы пошли на тривиальную проблему с отображением, которая не связана с Python, а не с проблемой основного содержимого файла, вызванной предоставленным кодом Python , – TigerhawkT3

0

учитывая проблема была правильно идентифицирована @ TigerhawkT3 (решение которого я считаю отлично), позволь мне предложить альтернативу, которая следует своему первоначальному ходу мысли:

import optparse 
import datetime 
import csv 
file_name='sample.txt' 
with open(file_name,'rb') as f, open('names.csv', 'wb') as ofile:    
    reader = csv.reader(f, delimiter=",") 
    writer = csv.writer(ofile) 
    #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 
     writer.writerow(p) 

Основное отличие заключается в том, что на выходе файл записывается при чтении входного файла. Производительность может быть немного медленнее, учитывая буферизацию, но она может пригодиться для больших объемов данных.

+0

О, хорошо @ TigerhawkT3 обновил свой ответ, включив этот подход. Выберите его ответ :) – Pynchia