2014-09-01 43 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

相关问题