在Python中,是否有一种逐个令牌读取文本文件的方法?

4

我需要处理一个BIG文本文件,其中包含用空格分隔的浮点数并以ASCII表示:

1.0012 0.63 18.201 -0.7911 92.2869 ...

如何使用内置的Python工具逐个读取这些数字(不是整个文件,也不是逐行读取)?示例中,用于解决此任务的C源代码如下:

float number;
FILE *f = fopen ("bigfile.txt", "rt");
while (!feof (f)) {
    fscanf (f, "%f", &number);
    /* ... processing the number here ... */
}
fclose (f);

这个回答解决了你的问题吗?使用指定分隔符读取文件中的换行符 - tevemadar
请参考以下两个链接:https://dev59.com/OFsW5IYBdhLWcg3wDzku 和 https://dev59.com/-mkw5IYBdhLWcg3wBmCA - tevemadar
您提供的链接是可接受的解决方法,但我想知道标准Python文件对象是否有一个方法来执行此操作。谢谢。 - R0bur
4个回答

2

1

您应该能够逐行阅读,然后使用split()函数将每行拆分为数字令牌:

with open('file.txt') as f:
    lines = f.readlines()

for line in lines:
    tokens = line.split()
    for token in tokens:
        # process number here

1
但问题是,OP指定了以空格分隔的值,没有提到换行符。 - Ann Zen
@AnnZen 我的回答对于单行文件仍然有效。 - Tim Biegeleisen
1
我知道,但这样就变成了“先读入整行,然后再分割”,而原帖作者想要逐行读入。 - Ann Zen

1
如果逐行解决方案不可行(例如文件只有一行),您可以使用 read(size=1) 逐个字符地读取。

您可以像这样做:

current = ""
with open("file.txt") as f:
    while True:
        char = f.read(1)
        if char == "":
            # Reached EOF
            break
        elif char.isdecimal():
            current += char
        else:
            num = float(current)
            # process num however you like
            current = ""

0
你可以尝试使用 str.isspace() 方法来检查空格:
nums = ['0']
char = ' '
with open('file.txt', 'r') as f:
    while char:
        char = f.read(1)
        if nums[-1][-1].isspace():
            nums.append(char)
        else:
            nums[-1] += char
nums = list(map(float, nums))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接