2017-03-17 3 views
3

나는 CSV 데이터 파일의 디렉토리를 갖고 있으며 목록 이해력 설명 내에서 pandas.read_csv()을 사용하여 한 줄에 모든 파일을로드합니다.list comprehension에서 다른 작업과 함께 print()를 사용하는 방법은 무엇입니까?

import glob 
import pandas as pd 
file_list = glob.glob('../data/') 
df_list = [pd.read_csv(f) for f in file_list] 
df = pd.concat(df_list, ignore_index=True) 

지금 나는 그것이 데이터 파일을로드 할 때 파일 경로마다 시간을 인쇄 할,하지만 난 지능형리스트에서 여러 문을 사용하는 방법을 찾을 수 없습니다. 예를 들어 [pd.read_csv(f); print(f) for f in file_list]과 같은 문자는 SyntaxError이됩니다.

가장 가까운 것은 print()pass처럼 인쇄 된 if 문에서 None을 반환하도록하는 것입니다.

df_list = [pd.read_csv(f) for f in file_list if print(f) is None] 

적절한 방법이 있습니까? 나는 그것의 간결함을 위해 목록 이해력을 좋아하지만, 여러 문장을 허용하는 것처럼 보이지 않는다.

답변

1

당신이 목록 이해를 원하는 경우 (해할 for 루프를 통해 속도 향상 제공) : 당신이 원하는 것을 할 수

적절한 방법은 오히려 루프, 모든 지능형리스트를 사용하지 않는 것입니다

:

df_list = [pd.read_csv(f) for f in file_list if not print(f)] 

는 다른 방법으로 작업을 수행하는 기능을합니다 None이 falsy 때문에, 당신은 약간 솔루션을 수정할 수 있습니다

그러나 접근법은 부작용과 관심 대상인 return 값을 갖고 있기 때문에 Python이 일반적으로 따르는 명령 - 쿼리 분리 원리를 위반합니다. 그럼에도 불구하고, 나는 이것이 매우 실용적이라고 생각합니다. 특히 print()으로 데이터를 보려고하는데 나중에는 print() 호를 제거 할 계획입니다.

2

목록 이해는이를 위해 설계되지 않았습니다. 오히려 단지 반복 가능한 목록을 반복하는 목록을 채우기위한 것입니다 (조건에 맞는 경우). Python은 코드 라인에 대한 가독성을 강조합니다.

for f in file_list: 
    print(f) 
    df_list.append(pd.read_csv(f)) 
0

이미 언급했듯이 일반적으로 목록 이해에 부작용이있는 함수는 사용하지 않아야합니다. 그러나 디버깅 목적으로 을 사용하면 감사하겠습니다. 이와 비슷한 것이 유용 할 수 있습니다.

한 가지 방법, 당신의 if 상태와 유사하게, print 기능 None 따라서이 평가하고 두 번째 연산자 반환 반환한다는 사실을 이용하고, or을 사용하는 것입니다 :

df_list = [print(f) or pd.read_csv(f) for f in file_list] 

을하지만이 될 수를 이해하기 어렵고 의도가 명확하지 않습니다. 또는, peek 기능 인쇄를 정의하고 인수를 반환하고 이해에 그것을 사용할 수 있습니다

def peek(x, *args, **kwargs): 
    print(x, *args, **kwargs) 
    return x 

df_list = [pd.read_csv(peek(f)) for f in file_list] 

당신은 또한 (이 경우 print) 적용 할 수있는 기능을 전달이 더 일반적인 만들 수있는 다른 것 매개 변수를 peek 함수에 전달하거나 먼저 debug_enabled 변수가 실제로 True으로 설정되어 있는지 확인합니다.