Python help to debug an error when modify a file in a stream mode

吃可爱长大的小学妹 提交于 2019-12-25 07:15:24

问题


I have the following problem. I am reading a file x,y,z as:

481492.93 6244326.24 26.56
481493.03 6244325.60 25.06
481493.17 6244324.68 22.89
481493.50 6244322.52 17.80
481492.84 6244327.05 27.84
481492.90 6244326.66 26.90
481492.86 6244327.16 27.45
481493.48 6244323.08 17.79
481492.80 6244327.80 28.30
481492.94 6244326.84 26.04
..........................

i wish to read, modify, and write on the same file (without create a back-up file because the originals file is more than 10GB)

481492.93 6244326.24 26.56 (375, 2902)
481493.03 6244325.60 25.06 (376, 2902)
481493.17 6244324.68 22.89 (377, 2902)
481493.50 6244322.52 17.80 (379, 2903)
481492.84 6244327.05 27.84 (375, 2902)
481492.90 6244326.66 26.90 (375, 2902)
481492.86 6244327.16 27.45 (374, 2902)
481493.48 6244323.08 17.79 (379, 2903)
481492.80 6244327.80 28.30 (374, 2902)
481492.94 6244326.84 26.04 (375, 2902)
..........................

i wrote the following approach

def get_point_grid_id(x,y,x_min,y_max,x_dist,y_dist):
        col = int((x - x_min)/x_dist)
        row = int((y_max - y)/y_dist)
        return (row, col)

with open(file_temp, "r+") as f:
    for line in open(file_temp):
        x,y,z = line.split()
        id = get_point_grid_id(float(x),float(y),origin[0],origin[1],1,1)
        element = [x,y,z,id]
        newelement = " ".join([str(e) for e in element])+ "\n"
        f.write(newelement)

when i run the function i got the following error

Traceback (most recent call last):
  File "<editor selection>", line 3, in <module>
ValueError: too many values to unpack

i suppose it's a connection problem with the original file

the error appears

>>> x,y,z = line.split()
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
ValueError: too many values to unpack

where line is strange

'481499.82 6244470.31 29.23 (231, 2909)\n' 

instead of '481499.82 6244470.31 29.23\n'

using print line after for line in open(file_temp): i got this print after run from a new file

481499.98 6244494.02 34.14
481499.98 6244494.02 34.14 (208, 2909)
481499.96 6244471.05 33.39
481499.96 6244471.05 33.39 (231, 2909)
481499.95 6244471.27 33.46
481499.95 6244471.27 33.46 (230, 2909)
481499.98 6244473.84 32.72
481499.98 6244473.84 32.72 (228, 2909)
481499.98 6244474.07 32.70
481499.98 6244474.07 32.70 (228, 2909)
481499.97 6244474.28 32.93
481499.97 6244474.28 32.93 (227, 2909)
481499.88 6244474.40 34.35
481499.88 6244474.40 34.35 (227, 2909)

回答1:


opening the line in r+ mode means that you read a line, ie 38 characters read. Then you modify those 38 characters Then, at the current file position (character 39) you over write the existing data

I would guess this is not what you want

Hope this helps




回答2:


This just isn't going to work. As Martijn said,

I

file objects have a buffer position. Every time you read a character the buffer position advances by 1. Suppose you read a line that's 10 characters long:

>>> myfile = open('some_file.txt')
>>> myfile.tell() #gets the buffer position
0
>>> myfile.readline()
'012345678\n'

Now the buffer position is advanced by len(line) characters:

>>> myfile.tell()
10

This means that when you call myfile.write(), it starts writing at position 10.

II

You simply can't "insert" characters into a file without overwriting something, or appending characters to the end (assuming that the buffer position is at the end of the file).

So what do you do?

You can create a temporary file, and simultaneously read from your input file, and write to your temp file. Afterwards (if you should wish), you can replace your original file with the temporary one:

with open(input_file) as infile, open(output_temp_file, "w") as outfile:
    for line in infile:
        x, y, z = line.split()
        new_line = ' '.join([x, y, z] + [function_of_xyz(x, y, z)]) + '\n'
        outfile.write(new_line)

You should also check out the csv module.



来源:https://stackoverflow.com/questions/15033309/python-help-to-debug-an-error-when-modify-a-file-in-a-stream-mode

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!