사용자가 Python에서 input
파일 이름 (예 text.txt
:)을 읽고 싶지만 파일 형식이 아닌 문자열로 읽습니다.
r=(input("insert the name of the file"))
File= open(r,'r')
data=File.read()
data.split()
print(data)
편집 : 내 대답에 대한 의견에 따라 OP는 파일의 모든 단어에 대한 dict
포함 을 빌드 {word:wordcount}
하려고합니다 (공백으로 구분).
이 작업을 수행하는 정말 좋은 방법이 하나 있지만 실제로는 아무것도 가르쳐주지 않으므로 먼저 느린 방법을 보여주고 나중에 최적의 솔루션을 포함합니다.
wordcountdict = dict()
r = input("filename: ")
with open(r, 'r') as infile:
for line in infile:
for word in infile.split(): # split on whitespace
try:
wordcountdict[word.lower()] += 1
# try adding one to the word in the counter
except KeyError:
wordcountdict[word.lower()] = 1
# If the word isn't in the dict already, set it to 1
지금 당신은 몇 가지 일반적인 단어 (필터링 할 수 있습니다 "at"
, "I"
, "then"
당신이 (같은 그들의 블랙리스트를 구축 할 수있는 경우 등) blacklist = ['at', 'i', 'then']
) 및 수행 if word.lower() in blacklist: continue
내부 for word in infile.split()
와 전에 try/except
블록을. 그것은 단어가 블랙리스트에 있는지 테스트하고, 그럴 경우 나머지 실행을 건너 뜁니다.
이제 저는이 작업을 수행 할 수있는 훌륭한 방법을 약속했습니다 collections.Counter
. 목록의 요소를 계산하기 위해 특별히 만들어진 사전입니다. 단어를 계산하는 더 빠른 방법이 있지만 Python (imo)에서는 더 깨끗한 방법이 없습니다. 이 질문에 대한 타이밍을 확인합니다.
from collections import Counter
wordcountdict = Counter()
r = input("filename: ")
with open(r, 'r') as infile:
for line in infile:
wordcountdict += Counter( map(str.lower,line.split()) )
에서 가져 오기 collections
또는 map
함수를 사용한 적이 없다면 이것은 매우 신비한 일이 될 것이므로 먼저 넣지 않았습니다! :).
기본적으로 : collections.Counter
이터 러블을 인수로 취하고 이터 러블의 모든 요소를 계산합니다 (그래서`Counter ([1,1,2,3,4,4,4]) == {1 : 2, 2 : 1, 3 : 1, 4 : 3}). 추가 할 수 있으며 고유 한 곳에 새 키를 생성하고 그렇지 않은 곳에 값을 추가합니다.
map(callable, iterable)
실행 callable
반복자의 각 요소의 인수 및 반환을 가진 map
객체 (그것의 list
Python2에서) 자체 반복자를하다 (그래서 map(str.lower, ["ThIS", "Has", "UppEr", "aNd", "LOWERcase"])
당신이 얻을 통해 반복 할 수있는지도 객체 제공 ["this","has","upper","and","lowercase"]
하기 때문에 str.lower
그것의 모든 호출되었다).
두 단어를 결합 할 때에서 각 개별 단어가 소문자로 collections.Counter
된 map
객체를 공급 한 line.split()
다음 Counter
누산기로 사용되는 처음에 비어 있는 객체에 추가합니다 . Capisce?
코드에 대한 문제가 무엇인지는 매우 불분명하므로 지식을 일부 버리고 무언가가 유지되기를 바랍니다.
r = input("insert the name of the file")
# this will be a string from the user, containing the file name, e.g.
# r == "text.txt"
# this is normal, because you pass `open` a filename, not a file object
File = open(r, "r")
# this makes File a file object that's pointed at the file name given from
# the user, opened for reading.
data = File.read()
# this sets data equal to the string containing the entire text in File
# This is usually NOT what you want to do, but without further explanation,
# I'll leave it be
data.split()
# this isn't an in-place operation, so you built a list out of the string
# data, split on newlines, then threw it away since you didn't assign it to
# anything.
print(data)
# prints your original data variable, because remember data.split() is not
# in-place, you'd have to do data = data.split(), but that's the wrong way
# to do that anyway....
당신이하고 싶은 일이 여기 있습니다 ...
filename = input("insert the name of the file: ")
with open(filename, "r") as infile:
data = infile.readlines()
이는 더 나은 방법이기 때문에 with
대신 컨텍스트 관리자 ( )를 사용 File = open(filename)
합니다. 기본적으로 File.close()
작업을 마친 후 입력하지 않아도 되며 파일 작업을하는 동안 문제가 발생할 수 있다는 사실을 설명하므로 어떤 이유로 든 코드에서 예외가 발생하고 GET이되지 않는 경우 당신에 File.close()
가 떠나면, 그것은 여전히 파일 개체를 닫 with
블록을.
문자 그대로 똑같은 .readlines()
대신 대신 사용 합니다 .read().split()
. 이것은 아마도 당신이하려는 일이 아닐 수도 있지만 (대부분의 경우 모든 데이터를 메모리에 덤프하는 대신 파일을 반복하기를 원합니다) 더 많은 컨텍스트가 없으면 더 이상 도움을 드릴 수 없습니다.
또한 Capitalizednames
클래스가 있는 PEP8의 명명 규칙을 따릅니다 . File
클래스가 아니고 파일 객체이므로 infile
대신 이름을 지정했습니다 . 나는 주로 사용 in_
하고 out
파일 이름을하지만 YMMV.
파일로하려는 작업에 대해 주석을 달면 특정 코드를 작성할 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다