2017-12-22 4 views
-2

.csv 파일에서 회선 평균을 계산하고 각 회선의 평균 목록을 반환하려고합니다. 현재, 나는목록의 목록에서 아포스트로피를 제거하는 방법

in_ = [['1,2'], ['1,1,1,1'], ['-1,0,1'], ['42,17']] 

를 얻을 수 있지만 개별 목록을 평균하기로 아포스트로피를 제거해야합니다! int()을 사용해 보았지만 행운이 없었습니다.

내 원하는 출력

out = [[1, 2], [1, 1, 1, 1], [-1, 0, 1], [42, 17]] 

내 현재 코드는 다음과 같습니다

def line_averages(filename): 
    """takes a file and returns the average values of each line in a 
    .csv file""" 
    f = open(filename, 'r') 
    lines = f.readlines() 
    #print(lines) 
    f.close() 
    words = [] 
    for line in lines: 
     words.append(line.split()) 
    for i in words: 
     words.replace("'", "") 
    return words 
+1

전체 목록 요소가 하나의 문자열이기 때문에 문제가 발생합니다. ','에 먼저 나누고 int로 캐스트하십시오. –

+2

* "remove apostrophes"* "문자열을 정수로 변환 하시겠습니까?" 검색하기가 더 쉬울 수도 있습니다. – jonrsharpe

+0

CSV 파일에서 읽는 데 사용하고있는 코드를 표시 할 수 있습니까? 번거로운 사후 처리 단계없이이 작업을 자동으로 수행 할 수있는 방법이있을 수 있습니다. – Kevin

답변

3

당신은 여기에 CSV 리더 바퀴를 발명하는 다시됩니다. 대신에 csv module을 사용하여 분할을 처리하십시오.

def line_averages(filename): 
    """takes a file and returns the average values of each line in a 
    .csv file""" 
    with open(filename, 'r', newline='') as f: 
     reader = csv.reader(f) 
     for row in reader: 
      yield [int(c) for c in row] 

이것은 발전기를 생산하고 반복 정수 당신에게 행을 제공합니다 : 우리는 만 정수로 문자열 열을 변환해야합니다 또한리스트의 목록을 반환 할 수 있습니다

for row in line_averages(some_file_name): 
    # do something with each row 

:

def line_averages(filename): 
    """takes a file and returns the average values of each line in a 
    .csv file""" 
    with open(filename, 'r', newline='') as f: 
     reader = csv.reader(f) 
     return [[int(c) for c in row] for row in reader] 

시도가 쉼표가 아닌 공백으로 나뉩니다. 명시 적으로 ','에 분할해야하고, 정수에 열을 변환하는 것 :

def line_averages(filename): 
    """takes a file and returns the average values of each line in a 
    .csv file""" 
    with open(filename, 'r') as f: 
     return [[int(c) for c in line.split(',')] for line in f] 

나는 정수의 목록에 파일의 각 라인을 변환, 목록의 목록을 생성하려면 여기를 nested list comprehensions을 사용했다.

또한 파일을 context manager in a with statement으로 사용했습니다. 이렇게하면 관리 대상 블록에서 어떤 일이 발생하더라도 파일이 닫힙니다. 수동으로 닫을 필요가 없습니다.

또한이 파일을 반복자로 사용했습니다.; 반복 할 때마다 (for 루프처럼) 파일의 다음 줄을 가져옵니다. 앞에 모든 라인을 읽을 필요가 없습니다 file.readlines().

+0

회신 해 주셔서 감사합니다. 정확한 코드를 사용하면 출력됩니다.

+0

@SebTerry : 예, 반복자가 있습니다. 이제 이것을 for for 루프에서 사용할 수 있습니다. –

관련 문제