2013-09-05 3 views
0

У меня есть CSV-файл, который выглядит следующим образом:фиксированной длины текстового файла с помощью CSV

123456,456789,12345,123.45,123456 
123456,456789,12345,123.45,123456 
123456,456789,12345,123.45,123456 

Я являюсь экстремально новым для программирования Python, но я учусь и найти Python, чтобы быть очень полезным. Я в принципе хочу выход выглядеть следующим образом:

123456 456789 12345 123.45 123456 
123456 456789 12345 123.45 123456 
123456 456789 12345 123.45 123456 

В принципе, все поля прямо оправданные, имеющие фиксированную длину. В csv-файле нет заголовка.

Вот код, который я пытался до сих пор и, как я уже сказал, я очень новичок в Python:

import csv 
with open('test.csv') as csvfile: 
spamreader = csv.reader(csvfile, delimiter=',') 
for row in spamreader: 
    print(', '.join(row)) 
    with open('test2.txt', 'wb') as f: 
writer = csv.writer(f) 
writer.writerows(f) 

Любая помощь будет принята с благодарностью: Спасибо заранее.

+0

Как в табуляцией файл? Проверьте этот вопрос так ... http://stackoverflow.com/questions/10220412/convert-tab-delimited-txt-file-into-a-csv-file-using-python –

ответ

0

КИ у вас есть беспорядок проблем с кодом:

  1. Ваших отступов все неправильно. Это одна из основных концепций python. Идите искать в Интернете и немного почитать об этом, если вы не понимаете, что я имею в виду
  2. Часть, которая открывает 'test2.txt', - это внутри цикла spamreader, то есть он снова открывается и усекается для каждого строка в 'test.csv'.
  3. Вы пытаетесь написать файл себе с этой строкой: writer.writerows (f) (помните? F - файл, который вы пишете ...)
  4. Вы используете csv.writer для записи строк до txt файл.
  5. Вы хотите интервал между каждым элементом, но вы не делаете, что где-нибудь в вашем коде

Так суммировать все эти проблемы, вот фиксированный пример, который на самом деле не так уж далеко от вашего кода как это:

import csv 

res = [] 
# start a loop to collect the data 
with open('test.csv') as csvfile: 
    spamreader = csv.reader(csvfile, delimiter=',') 
    for row in spamreader: 
     line = '\t'.join(row) + '\r\n' # the \n is for linebreaks. \r is so notepad loves you too 
     res.append(line) 

# now, outside the loop, we can do this: 
with open('test2.txt', 'wb') as f: 
    f.writelines(res) 

EDIT

Если вы хотите, чтобы контролировать расстояние вы можете использовать ljust функцию следующим образом:

 line = ''.ljust(2).join(row) 

Это гарантирует, что между каждым предметом будет 2 пробела. пространство по умолчанию, но если вы хотите, чтобы указать, что ljust будет использовать вы можете добавить второй параметр к нему:

 line = ''.ljust(5, '-').join(row) 

, то каждая строка будет выглядеть следующим образом:

123456-----456789-----12345-----123.45-----123456 

И спасибо за Филипп Т. который упомянул об этом в комментариях

2-Edit

Если вы хотите другую длину для каждого столбца необходимо предопределить его. Лучшим способом было бы создать список в той же длине, что и столбцы файлов csv, причем каждый элемент имеет длину этого столбца, а последний - конец строки (что удобно, потому что «.join не делает это само по себе), затем застегните его своей строкой.Предположим, что вам нужна вкладка для первого столбца, затем два пробела между каждым из других столбцов. Тогда ваш код будет выглядеть следующим образом:

spacing = ['\t', ' ', ' ', ' ', '\r\n'] 
# ... the same code from before ... 
     line = ''.join([j for i in zip(row, spacing) for j in i]) 
# ... rest of the code ... 

Список постижение петля немного запутанная, но думать об этом так:

for i in zip(row, spacing): # the zip here equals ==> [(item1, '\t'), (item2, ' ') ...] 
    for j in i: # now i == (item1, '\t') 
     j # so j is just the items of each tuple 

С списком пониманием, это выходы: [item1, ' \ t ', item2,' ', ...]. Вы присоединяетесь к этому вместе, и все.

+0

Кроме того, я думаю, что вместо используя табуляцию, фиксированную длину можно выполнить с помощью метода ljust (или rjust) basestring –

+0

спасибо, добавлено в решение – yuvi

+0

Если вы хотите определить каждый столбец как разную длину, как бы вы это написали? – user2750613

0

Попробуйте это:

import csv 
with open('data.csv') as fin, open('out.txt','w') as fout: 
    data = csv.reader(fin,delimiter=',') 
    resl = csv.writer(fout,delimiter='\t') 
    resl.writerows(data) 
Смежные вопросы