2010-09-10 24 views
6

Tôi quan tâm đến việc không phải viết bản đồ hàm int vào bộ chuỗi của chuỗi mà tôi hiện có. Xem phần cuối cùng của ví dụ của tôi:python csv reader - chuyển đổi chuỗi thành int trên dòng khi lặp lại

import os 
import csv 

filepath = os.path.normpath("c:/temp/test.csv") 

individualFile = open(filepath,'rb') 
dialect = csv.Sniffer().sniff(individualFile.read(1000)) 

individualFile.seek(0) 
reader = csv.reader(individualFile,dialect) 

names = reader.next() 

print names 

def buildTree(arityList): 
    if arityList == []: 
     return 0    
    else: 
     tree = {} 
     for i in xrange(arityList[0][0],arityList[0][1]+1): 
      tree[i] = buildTree(arityList[1:]) 
     return tree 


census = buildTree([(1,12),(1,6),(1,4),(1,2),(0,85),(0,14)]) 

for m, f, s, g, a, c, t in reader: 
    try: 
     m,f,s,g,a,c,t = map(int,(m,f,s,g,a,c,t)) 
     census[m][f][s][g][a][c] += t 
    except: 
     print "error" 
     print m, f, s, g, a, c, t 
     break 

một cái gì đó như thế này Những gì tôi muốn làm là:

for m, f, s, g, a, c, t in map(int,reader): 
    try: 
     census[m][f][s][g][a][c] += t 
    except: 
     print "error" 
     print m, f, s, g, a, c, t 
     break  

tôi cố gắng này và tôi nhận được lỗi sau:

TypeError: int() argument must be a string or a number, not 'list' 

tôi đang gặp sự cố khi hiểu thông báo lỗi này. Tôi nghĩ rằng người đọc là một đối tượng có thể lặp lại - không phải là một danh sách. Nó trả về một danh sách cho mỗi lần lặp, nhưng chính nó không phải là một danh sách, đúng không? Tôi đoán đó là một câu hỏi phụ. Những gì tôi thực sự muốn biết là nếu có một cách để làm những gì tôi đang cố gắng làm. Xin lỗi vì mã không thực sự liên quan, nhưng tôi nghĩ tôi sẽ bao gồm toàn bộ ví dụ của mình. Cảm thấy tự do để xé nó thành bit! :) Tôi tự hỏi nếu nó có thể là tốt hơn để chỉ có một dict mà chìa khóa là một tuple thay vì công cụ này từ điển lồng nhau, nhưng ngay cả như vậy, tôi vẫn quan tâm đến việc tìm ra câu hỏi của tôi.

Trả lời

8

những gì bạn muốn là một cái gì đó như:

def int_wrapper(reader): 
    for v in reader: 
     yield map(int, v) 

Mã của bạn sau đó sẽ như thế nào:

reader = csv.reader(individualFile,dialect) 
reader = int_wrapper(reader) 

# all that other stuff 

for m, f, s, g, a, c, t in reader: 
    try: 
     census[m][f][s][g][a][c] += t 
    except: 
     print "error" 
     print m, f, s, g, a, c, t 
     break  

này chỉ sử dụng một chức năng máy phát điện để quấn người đọc và chuyển đổi các đầu vào cho số nguyên.

Nguồn gốc của TypeErrorreader là chức năng của máy phát điện có danh sách giá trị yield s. Khi bạn áp dụng map cho nó, bạn đang áp dụng map vào danh sách 'danh sách'. Điều này khác với việc áp dụng map vào danh sách các giá trị bạn thực hiện khi bạn viết nó theo cách dài.

Để minh hoạ, một cách khác để làm điều đó là

for m, f, s, g, a, c, t in (map(int, v) for v in reader): 
    # code 

này chỉ sử dụng một tại chỗ biểu hiện máy phát điện thay vì định nghĩa một hàm. Đó là một vấn đề của hương vị.

+0

điều này thật tuyệt vời. tôi chỉ đọc về máy phát điện và điều này giúp tôi hiểu chúng tốt hơn! xin lỗi để hành động như một tổng noob/fanboy, nhưng tôi chỉ mới bắt đầu nhận được vào python, và nó là như vậy damn tuyệt vời. – oob

+0

@oob. Đừng đổ mồ hôi. Tôi có thể sử dụng tất cả những người hâm mộ mà tôi có thể nhận được. Oh chờ đợi .... bạn đã nói về python. Yeah, pythons cũng khá tuyệt. – aaronasterling

Các vấn đề liên quan