2014-09-01 78 views
9

我想從一個文件中讀取一個數字列表作爲字符一次一個字符來檢查該字符是什麼,不管是數字,句點,+還是 - ,e或E或其他char ...然後根據它執行我想要的任何操作。我如何使用現有的代碼來完成此操作?這是我嘗試過的一個例子,但沒有奏效。我是python的新手。提前致謝!如何從python文件中一次讀取一個字符?

import sys 

    def is_float(n): 
     state = 0 
     src = "" 
     ch = n 
     if state == 0: 
      if ch.isdigit(): 
       src += ch 
       state = 1 
       ... 

    f = open("file.data", 'r') 
    for n in f: 
     sys.stdout.write("%12.8e\n" % is_float(n)) 
+1

你真的需要一次讀一個字節,或者每次只讀一個字節嗎?一次讀取一個字節會比一次讀取一行或整個文件慢得多。您仍然可以選擇逐個移動數據中的一個字符。 – 2014-09-01 20:05:44

+0

是的,我需要使用底部的三行代碼來讀取文件。我不確定的部分是使用它一次讀取一個字符。我需要在函數is_float中一次檢查每個字符。 – 2014-09-02 01:32:31

+0

相關:http://stackoverflow.com/questions/1035340/reading-binary-file-in-python – jfs 2014-09-08 18:50:29

回答

1

for x in open()從文件中讀取行。讀取整個文件中的文本塊,然後通過文本的每個字符:

import sys 

def is_float(n): 
    state = 0 
    src = "" 
    ch = n 
    if state == 0: 
     if ch.isdigit(): 
      src += ch 
      state = 1 
      ... 

data = open("file.data", 'r').read() 
for n in data: # characters 
    sys.stdout.write("%12.8e\n" % is_float(n)) 
+0

好吧,我明白了。我如何從數據中讀取每個字符呢?我會在is_float()函數內部做到這一點,對嗎? – 2014-09-02 01:34:52

52

這裏是使一個字符,在一次一個文件迭代的技術:

from functools import partial 

with open("file.data") as f: 
    for char in iter(partial(f.read, 1), ''): 
     # now do something interesting with the characters 
     ... 
  • with-statement打開文件並在完成後無條件關閉它。
  • read one character的常用方法是f.read(1)
  • partial通過總是調用f.read與參數創建的零個參數的函數。
  • iter()的兩個參數表單創建一個循環,直到看到空字符串文件結束標記爲止。
+0

這很美麗,但它並沒有回答這個問題。 – 2014-09-02 18:58:00

+6

@MichałKlich:當然它回答了這個問題。 – 2014-09-10 09:10:17

1

事實上,它更容易。 itertools中有一個很好的實用工具,這經常被忽略。 ;-)

for character in itertools.chain.from_iterable(open('file.data')): 
    process(character) 
+0

請注意,這實際上一次只讀取一行,但僅處理*字符。不一定是問題,但值得一提。 – zondo 2017-07-02 11:40:11

+0

你是對的,但沒有一種理智的方法_really_從字符中逐字讀出字符。至少有三層緩衝涉及,也許更多。添加一個圖層並不重要。 :-) – Veky 2017-07-04 04:51:52

相關問題