2016-04-03 15 views
2

Diğer şeylerin yanı sıra isimleri ve telefon numaralarını içeren bir csv dosyası var. Sadece telefon numaram varsa sadece bir isimle ilgileniyorum.Bir csv'den birkaç satır nasıl okunur?

user_data = {} 
with open(phone_numbers) as f: 
    reader = csv.DictReader(f) 
    user_data['Name'] = [record['Name'] for record in reader if record['phone']] 
    user_data['phone'] = [record['phone'] for record in reader if record['phone']] 

Ama ikinci öğe için boş bir dize var, record bir jeneratör olduğunu tahmin ediyorum ve:

with open(phone_numbers) as f: 
    reader = csv.DictReader(f) 
    names = [record['Name'] for record in reader if record['phone']] 

Ama aynı zamanda ilgili telefon numarasını istiyorum, bu deneyin ettik Bu yüzden iki kez tekrarlayabilirim.

Ben ettik dizilerini kullanmayı deneyin, ama sadece bu şekilde çalışmış: Bu durumda

user_data = {} 
with open(phone_numbers) as f: 
    reader = csv.DictReader(f) 
    user_data['Name'] = [(record['Name'],record['phone']) for record in reader if record['phone']] 

Ben iki değişken, phone ve Name user_data['Name'] saklanan var benim istediğim değil.

Ve çalışırsanız bu:

user_data = {} 
with open(phone_numbers) as f: 
    reader = csv.DictReader(f) 
    user_data['Name'],user_data['phone'] = [(record['Name'],record['phone']) for record in reader if record['phone']] 

aşağıdaki hata var:

ValueError: too many values to unpack

Düzenleme:

: Bu tablonun bir örnek

+ -------- + --------------- +
| Telefon | Sayı |
+ -------- + --------------- +
| Luis | 000 111 22222 |
+ -------- + --------------- +
| Paul | 000 222 3333 |
+ -------- + --------------- +
| Andrea | |
+ -------- + --------------- +
| Jorge | 111 222 3333 |
+ -------- + --------------- +

Tüm satırların bir adı vardır, ancak hepsinin telefonları yoktur.

+0

Listeyi son satırda aktarmak için zip (*) 'yi deneyin. –

+0

Bu cevabı kontrol edin http://stackoverflow.com/questions/5466618/too-many-values-to-unpack-iterating-over-a-dict-key-string-value-list – mk2

+0

Verilerinizi bir sütun olarak açıklayabilir misiniz? veya birden fazla ve aynı satırda birden fazla telefon numarası ve isim varsa? – PyNEwbie

cevap

1

Sen sözlüğüne başlığın listenizi dönüştürmek için dict kullanabilirsiniz bu. Ayrıca phone değeri olmadan kayıt varsa get kullanmanız gerekir. Doğru olan

input = open('mycsv.csv', 'r') 
user_data = {} 

for row in csv.reader(input): 
    if row[<row # containing phone>]: 
     name = row[<row # containing name>] 
     user_data[name] = row[<row # containing phone>] 
+0

teşekkürler, her ikisi de işe yaradı. Dict yaklaşımı ikiden fazla ürün için işe yarayacak mı? Ayrıca, ilk değeri anahtar olarak alır, bu, yinelenen değerler varsa kırılacağı anlamına gelir? –

+1

@Evet, ikiden fazla öğe için çalışacaktır. Dosyanızda 'name' kopyası varsa kırılmaz, sadece son değer korunur. Yinelenen bir anahtarınız varsa yapılacak en iyi şey, 'isim 'sonucunuzu' tuple 'listesi olarak tutmaktır. BTW, “tuple” ın kullanıldığı şeydir. Ayrıca eğer yardım ederse cevabı kabul etmeyi unutmayın. – styvane

1

Tahmininiz doğru. Bu sizi istediğiniz yaklaşım ise - iterasyon iki kez, sen seek(0)

reader = csv.DictReader(f) 
user_data['Name'] = [record['Name'] for record in reader if record['phone']] 
f.seek(0) # role back to begin of file ... 
reader = csv.DictReader(f) 
user_data['phone'] = [record['phone'] for record in reader if record['phone']] 

Ancak bu çok etkili değildir kullanmalıdır ve denemek ve bir rulo verilerinizi almalısınız.Aşağıdaki bir rulo yapmalısınız:

user_data = {} 

def extract_user(user_data, record): 
    if record['phone']: 
     name = record.pop('name') 
     user_data.update({name: record}) 

[extract_user(user_data, record) for record in reader] 

Örnek:

In [20]: cat phones.csv 
name,phone 
hans,01768209213 
grettel, 
henzel,123457123 

In [21]: f = open('phones.csv') 

In [22]: reader = csv.DictReader(f) 

In [24]: %paste 
user_data = {} 

def extract_user(user_data, record): 
    if record['phone']: 
     name = record.pop('name') 
     user_data.update({name: record}) 

[extract_user(user_data, record) for record in reader] 

## -- End pasted text -- 
Out[24]: [None, None, None] 

In [25]: user_data 
Out[25]: {'hans': {'phone': '01768209213'}, 'henzel': {'phone': '123457123'}} 
+2

Bunun sorun olduğundan emin değilim - son blok dosyayı yeniden açar. Sorun paketten çıkıyor. –

1

ben sütun başlıkları olmadığından daha sonra orada işaret gibi bir csv dosyası olduğundan çok daha kolay bir yaklaşım olduğunu düşünüyorum böylece hiçbir şey için bu testler değil, hiçbir şey adını ve telefon eklerse l vardır DictReader kullanarak

import csv 
user_data = [] 
with open(f,'rb') as fh: 
    my_reader = csv.DictReader(fh) 
    for row in my_reader: 
     if row['phone'] != '' 
      user_details = dict() 
      user_details['Name'] = row['Name'] 
      user_details['phone'] = row['phone'] 
      user_data.append(user_details) 

user_data için - her satırda telefon için bir değer, hiçbir şey ya da bir şey ya olduğu Sihirli yüzden gerçekleşmesi etting Eğer aradığınızı olması mümkün mü biz anlamadı ise yaklaşık vb

aramaya endişelenmenize gerek yok ve

import csv 
user_data = dict() 
with open(f,'rb') as fh: 
    my_reader = csv.DictReader(fh) 
    for row in my_reader: 
     if row['phone'] != '' 
      user_data['Name'] = row['phone'] 
+0

OP bir sonuç istediği gibi bir sözlük istedi, yapınız ona sözlüklerin bir listesini verecektir – Oz123

+0

Teşekkürler hala açık değilim ama her iki seçenek de çalışır – PyNEwbie

+0

@PyNEwbie İkinci kodunuzu denedim, bir telefon numarasına İsim, ama telefon varsa, isim ve telefon ile istiyorum. Ayrıca bir sebepten dolayı sadece bir satırın değerini alıyorum, dosyanın birkaç satırı var. –

1

sonra kolay yeterli bir sözlük istiyorum veri dosyanızdaki bazı bilgileri atıyor? Öte yandan

In [26]: !cat data00.csv 
Name,Phone,Address 
goofey,,ade 
mickey,1212,heaven 
tip,3231,earth 

In [27]: f = open('data00.csv') 

In [28]: r = csv.DictReader(f) 

In [29]: lod = [{'Name':rec['Name'], 'Phone':rec['Phone']} for rec in r if rec['Phone']] 

In [30]: lod 
Out[30]: [{'Name': 'mickey', 'Phone': '1212'}, {'Name': 'tip', 'Phone': '3231'}] 

In [31]: 

, dosya SADECE Name ve Phone sütun olmalıdır, sadece

In [31]: lod = [rec for rec in r if rec['Phone']] 
1

kullanılmasını istiyorsanız

import csv 

user_data = {} 
with open(phone_numbers) as f: 
    reader = csv.DictReader(f) 
    user_data = dict([(record['Name'], record['phone']) for record in reader if record.get('phone').strip()) 

Normalde satır indeksleme kullanmak Tüm zamanlar, paket açma hariç.

result = [(record["name"], record["phone"]) for record in reader if record["phone"]] 
# this gives [(name1, phone1), (name2,phone2),....] 

Sen anlam ve sözdizimsel mantıklı değil [dostuff for name, phone in result] değil name,phone = result, yapmak zorundayız.

1

: Eğer name s ve phone s listesi ayrı ayrı size *ifadesini

with open(phone_numbers) as f: 
    reader = csv.DictReader(f) 
    names, phones = zip(*[(record['name'], record['value']) for record in reader if record.get('phone').strip()]) 
İlgili konular