Python 如何逐字读取文件

Python 如何逐字读取文件,python,python-2.7,Python,Python 2.7,我有一个PPM文件,需要对其执行某些操作。该文件的结构如以下示例所示。第一行“P3”只是说明它是什么类型的文档。在第二行中,它给出了图像的像素尺寸,因此在本例中,它告诉我们图像是480x640。在第三行中,它声明了任何颜色可以接受的最大值。之后是代码行。每三个整数组给出一个像素的rbg值。因此,在本例中,第一像素具有rgb值49、49、49。第二像素具有rgb值48、48、48等 P3 480 640 255 49 49 49 48 48 48 47 47 47

我有一个PPM文件,需要对其执行某些操作。该文件的结构如以下示例所示。第一行“P3”只是说明它是什么类型的文档。在第二行中,它给出了图像的像素尺寸,因此在本例中,它告诉我们图像是480x640。在第三行中,它声明了任何颜色可以接受的最大值。之后是代码行。每三个整数组给出一个像素的rbg值。因此,在本例中,第一像素具有rgb值49、49、49。第二像素具有rgb值48、48、48等

P3
480 640
255
49   49   49   48   48   48   47   47   47   46   46   46   45   45   45   42   42   42   38   38   
38   35   35   35   23   23   23   8   8   8   7   7   7   17   17   17   21   21   21   29   29   
29   41   41   41   47   47   47   49   49   49   42   42   42   33   33   33   24   24   24   18   18   
...
现在,正如您可能注意到的,这个特定的图片应该是640像素宽,这意味着640*3整数将提供第一行像素。但这里的第一行远远不是包含640*3个整数。所以这个文件中的换行符是没有意义的,因此我的问题


读取Python文件的主要方法是逐行读取。但我需要把这些整数收集成640*3的一组,并把它们当作一条线。你会怎么做?我知道我可以逐行读取文件,并将每一行附加到某个列表中,但该列表将非常庞大,我认为这样做会给设备的内存带来不可接受的负担。但除此之外,我没有主意了。非常感谢您的帮助。

可能不是最“python”的方式,但是

遍历包含整数的行

保留四个计数-一个计数为3-颜色代码计数,一个计数为1920-已处理的数字,一个计数为列(0-639),另一个计数为行(0-479)

对于遇到的每个整数,将其添加到列表[color\u code\u count]索引处的临时列表中。递增颜色代码、颜色和处理的数字

一旦color_code_count为3,您就可以创建一个临时列表,并创建一个元组3或三元组(不确定术语是什么,但第一个像素的结构看起来像(49,49,49)),然后将其添加到包含640列和480行的列表中-将(49,49,49)插入像素[col][row]

增量列。 重置颜色代码计数。
“处理的数量”将继续增加,直到达到1920

当您到达1920时,您已到达第一排的末尾。
将已处理的数字和列重置为零,将行增加1

至此,第0行中应该有640个元组或三元组,从(49,49,49)、(48,48,48)、(47,47)等开始,现在开始在第1行第0列中插入像素值


就像我说的,可能不是最“python”的方式。使用join和map可能有更好的方法,但我认为这可能有效吗?这个“解决方案”如果你想这样称呼它,就不应该关心任何一行上的整数数量,因为在开始新的一行之前,你一直在计算希望通过(1920)的数字数量。

可能不是最“pythonic”的方式,但是

遍历包含整数的行

保留四个计数-一个计数为3-颜色代码计数,一个计数为1920-已处理的数字,一个计数为列(0-639),另一个计数为行(0-479)

对于遇到的每个整数,将其添加到列表[color\u code\u count]索引处的临时列表中。递增颜色代码、颜色和处理的数字

一旦color_code_count为3,您就可以创建一个临时列表,并创建一个元组3或三元组(不确定术语是什么,但第一个像素的结构看起来像(49,49,49)),然后将其添加到包含640列和480行的列表中-将(49,49,49)插入像素[col][row]

增量列。 重置颜色代码计数。
“处理的数量”将继续增加,直到达到1920

当您到达1920时,您已到达第一排的末尾。
将已处理的数字和列重置为零,将行增加1

至此,第0行中应该有640个元组或三元组,从(49,49,49)、(48,48,48)、(47,47)等开始,现在开始在第1行第0列中插入像素值


就像我说的,可能不是最“python”的方式。使用join和map可能有更好的方法,但我认为这可能有效吗?这个“解决方案”如果你想这样称呼它,就不应该关心任何一行上的整数数量,因为在你开始新的一行之前,你要计算你希望通过(1920)运算的数字的数量。

一种可能的方法是遍历每一个单词,然后遍历每一行。将它拆分成每一个单词

the_file = open("file.txt",r)

for line in the_file:
    for word in line.split():
        #-----Your Code-----     
从那里你可以用你的“单词”做任何你想做的事情。你可以添加
if语句
来检查每行中是否有数字:(虽然不是很像pythonic)

或者你可以测试每一行中是否有任何内容:(更像蟒蛇)


我建议您在新文档中添加新的“行”。

遍历每个单词的一种可能方法是遍历每行,然后
。将其拆分为每个单词

the_file = open("file.txt",r)

for line in the_file:
    for word in line.split():
        #-----Your Code-----     
从那里你可以用你的“单词”做任何你想做的事情。你可以添加
if语句
来检查每行中是否有数字:(虽然不是很像pythonic)

或者你可以测试每一行中是否有任何内容:(更像蟒蛇)


我建议您在新文档中添加每一行。

我是
C
程序员。很抱歉,如果此代码看起来像
C Style

f = open("pixel.ppm", "r")
type = f.readline()
height, width = f.readline().split()
height, width = int(height), int(width)
max_color = int(f.readline());
colors = []
count = 0
col_count = 0
line = []
while(col_count < height):
    count = 0
    i = 0
    row =[]
    while(count < width * 3):
        temp = f.readline().strip()
        if(temp == ""):
            col_count = height
            break
        temp = temp.split()
        line.extend(temp)
        i = 0
        while(i + 2 < len(line)):
            row.append({'r':int(line[i]),'g':int(line[i+1]),'b':int(line[i+2])})
            i = i+3
            count = count +3
            if(count >= width *3):
                break
        if(i < len(line)):
            line = line[i:len(line)]
        else:
            line = []
    col_count += 1
    colors.append(row)
for row in colors:
    for rgb in row:
        print(rgb)
    print("\n")

我是一名
C
程序员。很抱歉,如果此代码看起来像
C Style

f = open("pixel.ppm", "r")
type = f.readline()
height, width = f.readline().split()
height, width = int(height), int(width)
max_color = int(f.readline());
colors = []
count = 0
col_count = 0
line = []
while(col_count < height):
    count = 0
    i = 0
    row =[]
    while(count < width * 3):
        temp = f.readline().strip()
        if(temp == ""):
            col_count = height
            break
        temp = temp.split()
        line.extend(temp)
        i = 0
        while(i + 2 < len(line)):
            row.append({'r':int(line[i]),'g':int(line[i+1]),'b':int(line[i+2])})
            i = i+3
            count = count +3
            if(count >= width *3):
                break
        if(i < len(line)):
            line = line[i:len(line)]
        else:
            line = []
    col_count += 1
    colors.append(row)
for row in colors:
    for rgb in row:
        print(rgb)
    print("\n")

要从文件中一次读取三个空格分隔的字,请执行以下操作:

with open(filename, 'rb') as file:
    kind, dimensions, max_color = map(next, [file]*3) # read 3 lines
    rgbs = zip(*[(int(word) for line in file for word in line.split())] * 3)


为了避免一次创建列表,可以使用允许一次读取一个rgb值的
itertools.izip()

从文件中一次读取三个空格分隔的单词:

with open(filename, 'rb') as file:
    kind, dimensions, max_color = map(next, [file]*3) # read 3 lines
    rgbs = zip(*[(int(word) for line in file for word in line.split())] * 3)


为了避免一次创建列表,可以使用允许一次读取一个rgb值的
itertools.izip()

这似乎起到了作用:

from re import findall

def _split_list(lst, i):
    return lst[:i], lst[i:]

def iter_ppm_rows(path):
    with open(path) as f:
        ftype = f.readline().strip()
        h, w = (int(s) for s in f.readline().split(' '))
        maxcolor = int(f.readline())

        rlen = w * 3
        row = []
        next_row = []

        for line in f:
            line_ints = [int(i) for i in findall('\d+\s+', line)]

            if not row:
                row, next_row = _split_list(line_ints, rlen)
            else:
                rest_of_row, next_row = _split_list(line_ints, rlen - len(row))
                row += rest_of_row

            if len(row) == rlen:
                yield row
                row = next_row
                next_row = []
它不是很漂亮,但是
from re import findall

def _split_list(lst, i):
    return lst[:i], lst[i:]

def iter_ppm_rows(path):
    with open(path) as f:
        ftype = f.readline().strip()
        h, w = (int(s) for s in f.readline().split(' '))
        maxcolor = int(f.readline())

        rlen = w * 3
        row = []
        next_row = []

        for line in f:
            line_ints = [int(i) for i in findall('\d+\s+', line)]

            if not row:
                row, next_row = _split_list(line_ints, rlen)
            else:
                rest_of_row, next_row = _split_list(line_ints, rlen - len(row))
                row += rest_of_row

            if len(row) == rlen:
                yield row
                row = next_row
                next_row = []
P3
120 160
255
0   1   2   3   4   5   6   7   
8   9   10   11   12   13   
14   15   16   17   18   19   20   21   22   23   24   25   26   27   28   29   30   31   32   33   34   
[...]
9993   9994   9995   9996   9997   9998   9999   
for row in iter_ppm_rows('mock_ppm.txt'): 
    print(len(row), row[0], row[-1])
480 0 479
480 480 959
480 960 1439
480 1440 1919
480 1920 2399
480 2400 2879
480 2880 3359
480 3360 3839
480 3840 4319
480 4320 4799
480 4800 5279
480 5280 5759
480 5760 6239
480 6240 6719
480 6720 7199
480 7200 7679
480 7680 8159
480 8160 8639
480 8640 9119
480 9120 9599