2014-02-06 4 views
0

Я студент второго курса EE. Я только начал изучать python для своего проекта.разобрать файл csv в текстовый файл

Я намерен разобрать CSV-файл с форматом, как

3520005,"Toronto (Ont.)",C ,F,2503281,2481494,F,F,0.9,1040597,979330,630.1763,3972.4,1 
2466023,"Montréal (Que.)",V ,F,1620693,1583590,T,F,2.3,787060,743204,365.1303,4438.7,2 
5915022,"Vancouver (B.C.)",CY ,F,578041,545671,F,F,5.9,273804,253212,114.7133,5039.0,8 
3519038,"Richmond Hill (Ont.)",T ,F,162704,132030,F,F,23.2,53028,51000,100.8917,1612.7,28 

в текстовый файл, как в следующем

Торонто 2503281 Монреаль 1620693 Ванкувер 578041

Я извлекая 1-й и 5-й столбец и сохраните его в текстовом файле.

Это то, что у меня есть до сих пор.

import csv 
file = open('raw.csv') 
reader = csv.reader(file) 

f = open('NicelyDone.text','w') 

for line in reader: 
     f.write("%s %s"%line[1],%line[5]) 

Это не работает для меня, я был в состоянии извлечь данные из файла CSV в строке [1], строка [5]. (Я могу распечатать его) Но я не знаю, как записать его в .text-файл в том формате, который мне нужен.

Кроме того, я должен обработать первый столбец, например, «Торонто (Онт.)» В «Торонто». Я знаком с функцией find(), я предполагаю, что я мог извлечь Toronto из Торонто (Ont.), Используя «(« как символ остановки, , но основываясь на моих исследованиях, я понятия не имею, как его использовать и попросить его вернуть мне строку (Торонто)

Вот мой вопрос:.?

  1. Что такое формат данных для line[1]
    • Если это строка, как прийти f.write() не работает
    • Если это не строка, как ее преобразовать к строке?
  2. Как я извлечь слово Toronto из Toronto(Ont) в виде строки, используя find() или другие методы.

Мое мышление состоит в том, что я мог бы добавить эти две строки вместе, как c = a+ ' ' + b, что дало бы мне формат, который я хотел. Поэтому я могу использовать f.write() для записи в файл :)

Извините, если мои вопросы звучат слишком просто или глупо.

Благодаря вперед

Zhen

ответ

0
  1. Я не помню csv, что хорошо, так что я не знаю, если это строка или нет. Какую ошибку вы получаете? В любом случае, при условии его является строкой, ваша строка должна быть:

    f.write("%s %s " % (line[1], line[5])) 
    

    Другими словами, вам нужен набор скобок. Кроме того, у вас должно быть конечное пространство в вашей строке.

  2. Несколько хак, но лаконичный способ сделать это: line[1].split("(")[0]

    Это создаст список, который расщепляется на ( символе, а затем извлечь первый элемент.

1
  1. Все данные чтения вы получаете от csv.reader являются строками.
  2. Существует множество решений, но самое простое было бы разделить на ( и стирают любые пробелы:

    >>> a = 'Toronto (Ont.)' 
    >>> b = a.split('(') 
    >>> b 
    Out[16]: ['Toronto ', 'Ont.)'] 
    >>> c = b[0] 
    >>> c 
    Out[18]: 'Toronto ' 
    >>> c.strip() 
    Out[19]: 'Toronto' 
    

    или в одной строке:

    >>> print 'Toronto (Ont.)'.split('(')[0].strip() 
    

    Другой вариант должны были использовать регулярное выражение (re module).

Конкретная проблема в вашем коде лежит здесь:

f.write("%s %s"%line[1],%line[5]) 

Используя синтаксис % для форматирования строки, вы должны предоставить либо одно значение, или итератор. В вашем случае это должно быть:

f.write("%s %s" % (line[1], line[5])) 

Другой способ сделать то же самое, чтобы использовать метод format.

f.write('{} {}'.format(line[1], line[5])) 

Это гибкий способ форматирования строк, и я рекомендую вам прочитать в docs.


Что касается вашего кода, вы должны рассмотреть несколько вещей.

  • Всегда помните о том, чтобы закрыть обработчики файлов. Если вы используете with open(...) as fp, это позаботится о вас.

    with open('myfile.txt') as ifile: 
        # Do stuff 
    # The file is closed here 
    
  • Не используйте зарезервированные слова в качестве имени переменной. file - такая вещь, и, используя ее как нечто другое (shadowing), вы можете вызвать проблемы позже в своем коде.

  • Чтобы записать данные, вы можете использовать csv.writer:

    with open('myfile.txt', 'wb') as ofile: 
        writer = csv.writer(ofile) 
        writer.writerow(['my', 'data']) 
    
  • С Python 2.6 и выше, вы можете объединить несколько with заявления в одном заявлении:

    with open('raw.csv') as ifile, open('NicelyDone.text','w') as ofile: 
        reader = csv.reader(ifile) 
        writer = csv.writer(ofile) 
    

Объединяя эти знания, ваш сценарий может быть переписана на что-то вроде:

import csv 

with open('raw.csv') as ifile, open('NicelyDone.text', 'wb') as ofile: 
    reader = csv.reader(ifile) 
    writer = csv.writer(ofile, delimiter=' ') 
    for row in reader: 
     city, num = row[1].split('(')[0].strip(), row[5] 
     writer.writerow([city, num]) 
Смежные вопросы