2017-12-09 11 views
0

함수 매개 변수에서 여러 텍스트 파일을 가져 와서 조작 할 수 있어야합니다. 함수 매개 변수에서 * args를 사용하는 것이 효과가있을 것이라고 생각했지만 튜플과 문자열에 대한 오류가 발생합니다.args를 사용하여 매개 변수에서 여러 파일 수락 python

def open_file(*filename): 
    file = open(filename,'r') 
    text = file.read().strip(punctuation).lower() 
    print(text) 

open_file('Strawson.txt','BigData.txt') 
ERROR: expected str, bytes or os.PathLike object, not tuple 

어떻게하면됩니까?

+0

어떻게 그 기능을 부르겠습니까? 여러 개의 파일 이름을 전달하려면 튜플을 반복하고 각 파일을 열고 처리해야합니다. –

+0

나는이 함수를 어떻게 호출하는지 보여주기 위해 질문을 편집했다. 네가 방금 말한대로 어떻게하면 될까? @ PM2Ring – vvv12308

+0

BTW,'.strip (chars)'메소드는 문자열의 시작과 끝에서 문자를 지우고, 지정된 문자가 아닌 char을 만나면 더 이상 가지 않습니다. 따라서'file.read(). strip (punctuation)'을 사용하면 파일의 시작과 끝에서 구두점 문자 만 제거됩니다. 너가 원하는게 그거야? 또는 전체 파일에서 모든 구두점을 제거 하시겠습니까? –

답변

1

*args 구문을 함수 매개 변수 목록에 사용하면 함수의 튜플로 표시되는 여러 인수를 사용하여 함수를 호출 할 수 있습니다. 따라서 각 인수에 대해 프로세스를 수행하려면 루프를 만들어야합니다. 이처럼 :

from string import punctuation 

# Make a translation table to delete punctuation 
no_punct = dict.fromkeys(map(ord, punctuation)) 

def open_file(*filenames): 
    for filename in filenames: 
     print('FILE', filename) 
     with open(filename) as file: 
      text = file.read() 
     text = text.translate(no_punct).lower() 
     print(text) 
     print() 

#test 

open_file('Strawson.txt', 'BigData.txt') 

또한 텍스트에서 모든 문장 부호를 제거하는 데 사용할 수있는 사전 no_punct을 포함 시켰습니다. 각 파일이 자동으로 닫히도록 with 문을 사용했습니다. 당신이 기능을 "반환"각 파일의 처리 내용을 원하는 경우에 그 종료하는 기능을 알려주기 때문에


, 당신은 루프에 return를 넣을 수 없습니다. 파일 내용을 목록에 저장하고 루프의 끝에서이를 반환 할 수 있습니다. 그러나 더 나은 옵션은 함수를 생성기로 변환하는 것입니다. Python yield 키워드를 사용하면 간단 해집니다. 다음은 시작하기위한 예입니다. 우리는 이미 모든 문장 부호를 제거하고 open_file 내부 소문자로 텍스트를 접는 있기 때문에 필요하지 않을 것 : 나는 create_tokens에서 word.strip(punctuation).lower() 물건을 제거

def open_file(*filenames): 
    for filename in filenames: 
     print('FILE', filename) 
     with open(filename) as file: 
      text = file.read() 
     text = text.translate(no_punct).lower() 
     yield text 

def create_tokens(*filenames): 
    tokens = [] 
    for text in open_file(*filenames): 
     tokens.append(text.split()) 
    return tokens 

files = '1.txt','2.txt','3.txt' 
tokens = create_tokens(*files) 
print(tokens) 

참고.

여기에는 실제로 두 가지 기능이 필요하지 않습니다. 모든 것을 하나로 결합 할 수 있습니다.

def create_tokens(*filenames): 
    for filename in filenames: 
     #print('FILE', filename) 
     with open(filename) as file: 
      text = file.read() 
     text = text.translate(no_punct).lower() 
     yield text.split() 

tokens = list(create_tokens('1.txt','2.txt','3.txt')) 
print(tokens) 
+0

와우, 록, 고마워. 완벽하게 작동합니다. 하지만 다른 함수에서 그 함수를 사용하는 데 문제가 있습니다. 각 파일에 대한 토큰을 만들려면 return (텍스트)을 추가했지만 첫 번째 파일 만 반환합니다. 각 파일 조작을 반환하는 첫 번째 함수는 어떻게 얻습니까? def create_tokens() : text = open_file ('1.txt', '2.txt', '3.txt') 토큰 = [] for word.split() : tokens.append (word. 스트립 (구두점). print (토큰) return tokens – vvv12308

+0

@ vvv12309 루프 내에'return' 문을 넣으면 컨트롤이'return'에 도달하자마자 루프가 실행을 멈 춥니 다. 발전기가 필요한 것 같습니다. 내 대답에 몇 가지 코드를 추가하겠습니다. –

+0

@ vvv12309 업데이트 된 답변을 참조하십시오. 내 대답이 도움이 되었다면 [accepting] (http://meta.stackexchange.com/a/5235)을 고려하십시오. –