Я хотел бы создать список, когда row[4] является цифрой, а затем дополнить его row, если row[4] не является цифрой, но я получаю повторяющиеся результаты. Кто-нибудь может направить меня в правильном направлении?

Это пример CSV-файла:

Name,Last,,,Account
joe,joe last,,,11111
joe address,city,state,zip,
,,,,
sam,sam last,,,22222
sam address,city,state,zip,
,,,,
bob,bob last,,,33333
bob address,city,state,zip,

Мой код:

localdir = 'C:\\Users\\User\\My Documents'
fn = 'test_file.csv'

with open(os.path.join(localdir, fn), 'rb') as fopen:
    csvdata = list(csv.reader(fopen))

data = []
for row in csvdata:
    if not row[0] or row[0].startswith('Name'):
        continue
    if row[4].isdigit():
        accts = []
    accts += row
    data.append(accts)

for line in data:
    print(line)

Мои результаты:

['joe', 'joe last', '', '', '11111', 'joe address', 'city', 'state', 'zip', '']
['joe', 'joe last', '', '', '11111', 'joe address', 'city', 'state', 'zip', '']
['sam', 'sam last', '', '', '22222', 'sam address', 'city', 'state', 'zip', '']
['sam', 'sam last', '', '', '22222', 'sam address', 'city', 'state', 'zip', '']
['bob', 'bob last', '', '', '33333', 'bob address', 'city', 'state', 'zip', '']
['bob', 'bob last', '', '', '33333', 'bob address', 'city', 'state', 'zip', '']

Я бы хотел получить:

['joe', 'joe last', '', '', '11111', 'joe address', 'city', 'state', 'zip', '']
['sam', 'sam last', '', '', '22222', 'sam address', 'city', 'state', 'zip', '']
['bob', 'bob last', '', '', '33333', 'bob address', 'city', 'state', 'zip', '']
2
jes516 17 Дек 2015 в 22:52

3 ответа

Лучший ответ

Проблема в том, что вы добавляете accnts для каждой строки в файле.

Измените ваш if (последние 4 строки вашего цикла) на этот:

if row[4].isdigit():
    accts = []
else:
    data.append(accts)

accts += row

Или вы можете переписать логику, чтобы быть более понятным ..

with open(os.path.join(localdir, fn), 'rb') as fopen:
    data = []
    reader = csv.reader(fopen)
    header = next(reader)
    for row in reader:
             next_row = next(reader)
             blank_row = next(reader)
             data.append(row + next_row)

(Это работает, только если вы уверены, что ваш формат соответствует)

3
Chad S. 17 Дек 2015 в 21:11

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

from itertools import islice
import csv

with open("out.csv") as f:
    next(f)
    r = csv.reader(f)
    out = [row[0] + row[1] for row in iter(lambda: list(islice(r, 3)), [])]

Выход:

[['joe', 'joe last', '', '', '11111', 'joe address', 'city', 'state', 'zip', ''], 
['sam', 'sam last', '', '', '22222', 'sam address', 'city', 'state', 'zip', ''], 
['bob', 'bob last', '', '', '33333', 'bob address', 'city', 'state', 'zip', '']]

Используя python3 мы можем распаковать без ошибок:

from itertools import islice
import csv

with open("out.csv") as f:
    next(f)
    r = csv.reader(f)
    print([a + b for a, b, *_ in iter(lambda: list(islice(r, 3)), [])])
2
Padraic Cunningham 17 Дек 2015 в 21:10

Это не стандартный файл CSV, потому что чередующиеся строки имеют разные значения. К счастью, поскольку csv.reader является итератором, при необходимости легко next() захватить следующую строку.

import csv

# todo: debug test file
open('test_file.csv', 'w').write("""       Name,    Lastname,        ,     ,    Account
        joe,    joe last,        ,     ,      11111
 joe address,       city,   state,  zip,
            ,           ,        ,     ,
         sam,   sam last,        ,     ,      22222
 sam address,       city,   state,  zip,
            ,           ,        ,     ,
         bob,   bob last,        ,     ,      33333
 bob address,       city,   state,  zip,
            ,           ,        ,     ,
""")

with open('test_file.csv') as fp:
    reader = csv.reader(fp)
    for row in reader:
        row = [c.strip() for c in row]
        # skip empty lines and rows w/o col 0, then check digit
        if row and row[0] and row[4].isdigit():
            # add next line
            row.extend(c.strip() for c in next(reader))
            print(row)
1
tdelaney 17 Дек 2015 в 20:26