2017-01-12 5 views
1

Я питон нооб, но не новичок в программировании. Я много раз искал StackOverflow и не нашел ответа (или не понял, что нашел).Looping через namedtuple

Это то, что я хочу сделать

  1. Возьмите данные из файла CVS (50 полей) в положить в память

  2. Loop через информацию из другого источника

  3. В каждом итерации, петли через информацию CSV, найдите то, что мне нужно, и сделайте что-нибудь вместе с информацией из другого источника.

Я хочу знать, как писать данные CSV в память и как цикл через него внутри другого цикла

Спасибо.

Это насколько я

# -*- coding: UTF-8 -*- 
import csv 
from urllib import parse 
from collections import namedtuple 

# set up namedtuple structure 
    ARecord = namedtuple('ArchiveRecord', ['id', 'post_author', 'post_date']) #plus 50 fields 

# load csv info to memory 
with open("site-export.csv",encoding="utf-8") as csvfile: 
    r = csv.reader(csvfile, delimiter='|', quotechar='"') 
    for arch in map(ARecord._make, r): 
     print(arch.id) #print to show that something is happening 

# loop that gets info from other source 
    # loop through csv info from memory 
     # get field values per row by name 
     # do something together with info from both source 
+1

Вы хотите поместить все ваши экземпляры «ARecord» в список? – khelwood

+0

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

+0

@HananCohen Вы можете рассмотреть 'csv.DictReader': https://docs.python.org/2/library/csv.html#csv.DictReader – abukaj

ответ

2
with open("site-export.csv",encoding="utf-8") as csvfile: 
    r = csv.reader(csvfile, delimiter='|', quotechar='"') 
    csvInfo = [ARecord._make(row) for row in r] 

# loop that gets info from other source 
    for arch in csvInfo: 
     # use information in arch 
+0

Спасибо @abukaj, это именно то, что я искал. –

1

Вы можете использовать csv.DictReader и fieldnames способом вы можете поместить имена столбцов в списке.

Если эти имена совпадают с именами полей в вашем namedtuple, вы можете легко получить к ним доступ.

namedtuple может вернуть его данные, представленные в Словаре, используя _asdict(), а затем вы можете получить доступ к значениям по именам столбцов, возвращаемых DictReader.