2016-12-28 2 views
1

Я не могу понять, как скопировать строку заголовка из мастера в соответствие ... Мне нужно захватить первую строку в моем master csv и записать ее сначала в согласованы, затем напишите оставшиеся строки, если они соответствуют критериям ...Как скопировать строку заголовка в новый csv в python

with open('master.csv', 'r') as master, open('match.csv', 'w') as matched: 
    for line in master: 
      if any(city in line.split('","')[5] for city in citys) and \ 
      any(state in line.split('","')[6] for state in states) and \ 
      not any(category in line.split('","')[2] for category in categorys): 
       matched.write(line) 

Помогите. Я новичок в Python и не знаю, как использовать панда или что-нибудь еще ...

+0

то, что потребность в одно- двойной запятый-двойной двойной узор? Разве это так, что он игнорирует запятые, встроенные в кавычки? – ScottEdwards2000

+0

Вам нужен «город в городах»? Вы используете только оператор IF в одной строке за раз, верно? – ScottEdwards2000

+0

@ ScottEdwards2000 Один-двойной запятый-единственный-двойной шаблон из-за формата моего csv – CFraley

ответ

2

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

with open('master.csv', 'r') as master, open('match.csv', 'w') as matched: 
    matched.write(next(master)) # can't use readline when iterating on the file afterwards 

Кажется, что вам действительно нужен модуль csv, тем не менее, для остальных. Я отредактирую свой ответ, чтобы попытаться что-то в этом направлении

С модулем csv, не нужно, чтобы эти небезопасные split. Comma - разделитель по умолчанию, и кавычки также обрабатываются должным образом. Так что я бы просто написать:

import csv 
with open('master.csv', 'r') as master, open('match.csv', 'w') as matched: 
    cr = csv.reader(master) 
    cw = csv.writer(matched) 
    cw.writerow(next(cr)) # copy title 

    for row in cr: # iterate on the rows, already organized as lists 
     if any(city in row[5] for city in citys) and \ 
     any(state in row[6] for state in states) and \ 
     not any(category in row[2] for category in categorys): 
      cw.writerow(row) 

BTW чеки фильтра, что city содержится в row[5], но, может быть, вы хотите точного соответствия. Пример: "York" соответствует "New York", что, вероятно, не то, что вы хотите. Поэтому мое предложение будет использовать in, чтобы проверить, если строка в списке строк, для каждого критерия:

import csv 
with open('master.csv', 'r') as master, open('match.csv', 'w') as matched: 
    cr = csv.reader(master) 
    cw = csv.writer(matched) 
    cw.writerow(next(cr)) # copy title 
    for row in cr: 
     if row[5] in citys and row[6] in states and not row[2] in categorys: 
      cw.writerow(row) 

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

import csv 
with open('master.csv', 'r') as master, open('match.csv', 'w') as matched: 
    cr = csv.reader(master) 
    cw = csv.writer(matched) 
    cw.writerow(next(cr)) # copy title 
    cw.writerows(row for row in cr if row[5] in citys and row[6] in states and not row[2] in categorys) 

отмечают, что citys, states и categorys будет лучше, так как set s, а не list S поэтому поиск алгоритм намного быстрее (вы не предоставили эту информацию)

+0

Спасибо за помощь и совет. Я получаю эту ошибку после добавления кода в ... TraceBack (самый последний вызов последнего): Файл «yelpscrape.py», строки 51, в cw.writerow (рядом (кр)) # скопировать название ValueError : Операция ввода-вывода в закрытом файле – CFraley

+0

Nevermind. Я заработал. Не делал это правильно. Я считаю, что сейчас он работает. Спасибо, что помогли! – CFraley

0

Если вы не хотите слишком много думать о том, как работает линия по производству итератора, oOne простой способ сделать это для лечения первой линии особенное:

with open('master.csv', 'r') as master, open('match.csv', 'w') as matched: 
    first_line = True 
    for line in master: 
      if first_line or (any(city in line.split('","')[5] for city in citys) and \ 
      any(state in line.split('","')[6] for state in states) and \ 
      not any(category in line.split('","')[2] for category in categorys)): 
       matched.write(line) 
      first_line = False 
Смежные вопросы