在 C 中,您可以像這樣一次讀取一個值:
//from console
cin >> x;
//from file:
ifstream fin("file name");
fin >> x;
我想在 Python 中模擬這種行為。然而,在 Python 中獲取輸入的普通方法似乎是讀取整行、整個檔案或一組位數。
我想要一個函式,我們稱之為one_read(),它從檔案中讀取,直到遇到空格或換行符,然后停止。此外,對one_read()輸入的后續呼叫應該從它停止的地方開始。它應該如何作業的示例:
# file input.in is:
# 5 4
# 1 2 3 4 5
n = int(one_read())
k = int(one_read())
a = []
for i in range(n):
a.append(int(one_read()))
# n = 5 , k = 4 , a = [1,2,3,4,5]
我怎樣才能做到這一點?
uj5u.com熱心網友回復:
在 Python 中對檔案進行操作的任何東西或多或少都可以對標準輸入和標準輸出進行操作。該sys標準庫模塊定義stdin和stdout它給你訪問這些流作為類檔案物件。
一次讀取一行在 Python 中被認為是慣用的,因為另一種方式很容易出錯(只是 Stack Overflow 上的一個 C 示例問題)。但如果你堅持:你將不得不自己構建它。
如您所見,.read(n)最多n將從以文本模式打開的流中讀取文本字符(技術上,Unicode 代碼點)。在閱讀空白之前,您無法知道單詞的結尾在哪里,但是您可以.seek回傳一個位置 - 盡管不是在標準輸入上,這是不可查找的。
您還應該知道,input在提示用戶之前,內置函式將忽略標準輸入上的任何現有資料:
>>> sys.stdin.read(1) # blocks
foo
'f'
>>> # the `foo` is our input, the `'f'` is the result
>>> sys.stdin.read(1) # data is available; doesn't block
'o'
>>> input()
bar
'bar'
>>> # the second `o` from the first input was lost
uj5u.com熱心網友回復:
我認為以下應該讓你接近。我承認我沒有仔細測驗代碼。聽起來itertools.takewhile應該是你的朋友,像yield_characters下面這樣的生成器會很有用。
from itertools import takewhile
import regex as re
# this function yields characters from a file one a at a time.
def yield_characters(file):
with open(file, 'r') as f:
while f:
line = f.readline()
for char in line:
yield char
# double check this. My python regex is weak.
def not_whitespace(char):
return bool(re.match(r"\S", char))
# this should use takewhile to get iterators while something is
def read_one(file):
chars = yield_character(file)
while chars:
yield list(takewhile(not_whitespace, chars)).join()
在read_one上面的是一臺發電機,所以你需要做一些事情,如呼叫list就可以了。
uj5u.com熱心網友回復:
通常,您一次只閱讀一行,然后閱讀split每個部分。但是,如果由于資源原因您不能這樣做,您可以實作自己的閱讀器,它一次讀取一個字符,然后yield每次到達分隔符時讀取一個單詞(或者在本例中也是換行符或結尾檔案)。
此實作使用背景關系管理器來處理檔案打開/讀取,盡管這可能有點矯枉過正:
from functools import partial
class Words():
def __init__(self, fname, delim):
self.delims = ['\n', delim]
self.fname = fname
self.fh = None
def __enter__(self):
self.fh = open(self.fname)
return self
def __exit__(self, exc_type, exc_val, exc_tb):
self.fh.close()
def one_read(self):
chars = []
for char in iter(partial(self.fh.read, 1), ''):
if char in self.delims:
# delimiter signifies end of word
word = ''.join(chars)
chars = []
yield word
else:
chars.append(char)
# Assuming x.txt contains 12 34 567 8910
with Words('/tmp/x.txt', ' ') as w:
print(next(w.one_read()))
# 12
print(next(w.one_read()))
# 34
print(list(w.one_read()))
# [567, 8910]
uj5u.com熱心網友回復:
嘗試創建一個類來記住操作停止的位置。
該__init__函式采用檔案名,您可以修改它以采用串列或其他可迭代物件。
read_one檢查是否還有任何內容要讀取,如果有,則洗掉并回傳串列中索引 0 處的專案;這就是第一個空格之前的一切。
class Reader:
def __init__(self, filename):
self.file_contents = open(filename).read().split()
def read_one(self):
if self.file_contents != []:
return self.file_contents.pop(0)
按如下方式初始化函式并根據您的喜好進行調整:
reader = Reader(filepath)
reader.read_one()
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/401844.html
上一篇:滿足條件后如何讓訊息框出現?
