2016-01-03 29 views
2

我讀一個CSV文件轉換成namedtuple像這樣:閱讀CSV文件小寫與Python

import csv 
from collections import namedtuple 

#So we can handle bad CSV files gracefully 
def unfussy_reader(reader): 
    while True: 
     try: 
      yield next(reader.lower()) 

     # This is a bad row that has an error in it (csv.Error) 
     # Alternately it may be a line that doesn't map to the structure we've been given (TypeError) 
     except (csv.Error, TypeError): 
      pass 

     continue 

# Create the CSV reader object 
csv_reader = csv.reader(file_stream, delimiter=' ', quotechar='"', escapechar='^') 

# Set up the named tuple 
csvline = namedtuple('csv_line', 'field1, field2, field3') 

# Create the named tuple mapping object 
map_to_tuple = map(csvline._make, csv_reader) 

for line in unfussy_reader(map_to_tuple): 
    # do stuff 

這個效果很好,但我的問題是 - 我希望所有的內容CSV以小寫字母讀取。根據this question,一個簡單的lambda會做到這一點: map(lambda x:x.lower(),["A","B","C"]) 但我找不到任何地方把它放在數據結束在元組(因此無法分開)之前。

在這個結構(Python 3.5)中有沒有辦法做到這一點?

+1

在'csv_reader = ...'之前添加一行:'file_stream =(line.lower()for file in file_stream)'? – bbayles

+0

@bbayles - 工作,雖然我不得不將它分配給某些東西,然後改變'csv_reader ='行來指向,而不是'file_stream'。發佈它作爲答案,我會接受。謝謝 –

回答

2

你可以申請你爲它創建一個CSV讀者面前的lower變換流中。

lower_stream = (line.lower() for line in file_stream) 
csv_reader = csv.reader(lower_stream, delimiter=' ', quotechar='"', escapechar='^') 

圍繞lower_stream分配對象中的括號指定generator expression。它不會使用file_stream,並且不會將全部file_stream存入內存。

0

如何:

csv_reader = csv.reader(map(lambda line:line.lower(),file_stream), delimiter=' ', quotechar='"', escapechar='^')