Python 2.7 如何将列表保存到文本文件?

Python 2.7 如何将列表保存到文本文件?,python-2.7,list,pickle,qgis,cpython,Python 2.7,List,Pickle,Qgis,Cpython,我想将所有x和y坐标(光栅层中的每个像素居中)保存为文本文件中的列表。首先,为了测试,我编写了以下代码,证明它是正确的: import os import pickle mylist = [(12, 25), (65, 96), (10, 15)] path = r"data/listfile" file = 'file.txt' if not os.path.exists(path): os.makedirs(path) with open(os.path.join(pat

我想将所有x和y坐标(光栅层中的每个像素居中)保存为文本文件中的列表。首先,为了测试,我编写了以下代码,证明它是正确的:

import os
import pickle

mylist = [(12, 25), (65, 96), (10, 15)]

path = r"data/listfile"

file = 'file.txt'

if not os.path.exists(path):
    os.makedirs(path)


with open(os.path.join(path, file), 'wb') as handle:
    pickle.dump(mylist, handle)

with open(os.path.join(path, file), 'rb') as handle:
    aa = pickle.loads(handle.read())
print aa
在下一步中,我将此代码实际用于光栅层。该代码的MCVE是:

from qgis.core import *
from PyQt4 import *
import os
import pickle

ds = QgsRasterLayer("/LData/Pop/lorst.tif", "Raster")

pixelWidth = ds.rasterUnitsPerPixelX()
pixelHeight = ds.rasterUnitsPerPixelY()
originX, originY = (ext.xMinimum(), ext.yMinimum())
src_cols = ds.width()
src_rows = ds.height()

path = r"LData/Pop"

file = 'List.txt'

if not os.path.exists(path):
    os.makedirs(path)


def pixel2coord(x, y):
    xp = (pixelWidth * x) + originX + (pixelWidth / 2)
    yp = (pixelHeight * y) + originY + (pixelHeight / 2)
    return QgsPoint(xp, yp)

list =[]

for i in range(0, src_cols):
    for j in range(0, src_rows):
        rspnt = pixel2coord(i, j)
        list.append(rspnt)

with open(os.path.join(path, file), 'wb') as handle:
    pickle.dump(list, handle)

with open(os.path.join(path, file), 'rb') as handle:
    lst = pickle.loads(handle.read())
但我收到了这个错误:

Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/tmp/tmp4rPKQ_.py", line 70, in <module>
    pickle.dump(pntRstList, handle)
  File "/usr/lib/python2.7/pickle.py", line 1376, in dump
    Pickler(file, protocol).dump(obj)
  File "/usr/lib/python2.7/pickle.py", line 224, in dump
    self.save(obj)
  File "/usr/lib/python2.7/pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "/usr/lib/python2.7/pickle.py", line 606, in save_list
    self._batch_appends(iter(obj))
  File "/usr/lib/python2.7/pickle.py", line 621, in _batch_appends
    save(x)
  File "/usr/lib/python2.7/pickle.py", line 306, in save
    rv = reduce(self.proto)
  File "/usr/lib/python2.7/copy_reg.py", line 71, in _reduce_ex
    state = base(self)
TypeError: the sip.wrapper type cannot be instantiated or sub-classed 
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/tmp/tmp4rPKQ_uuq.py”,第70行,在
pickle.dump(pntRstList,句柄)
文件“/usr/lib/python2.7/pickle.py”,第1376行,在转储中
Pickler(文件,协议).dump(obj)
文件“/usr/lib/python2.7/pickle.py”,第224行,在转储中
自我保存(obj)
文件“/usr/lib/python2.7/pickle.py”,第286行,保存
f(self,obj)#用显式self调用未绑定方法
保存列表中第606行的文件“/usr/lib/python2.7/pickle.py”
自批附录(iter(obj))
文件“/usr/lib/python2.7/pickle.py”,第621行,在批处理附录中
保存(x)
文件“/usr/lib/python2.7/pickle.py”,第306行,保存
rv=减少(自编程)
文件“/usr/lib/python2.7/copy_reg.py”,第71行,在
状态=基本(自身)
TypeError:无法实例化或子分类sip.wrapper类型

有没有办法将xy列表转换为文本文件,并以数字格式而不是str进行回读?

最简单的方法是放弃使用
QgsPoint(xp,yp)
,而是使用元组,即只使用
(xp,yp)
。似乎<>代码> qgSPoTIT< /COD>是C++类的包装器;而啜饮包装纸的人不会知道腌制

请注意,上面还说:

注意

元组
(x,y)
不是真正的元组,它们是
QgsPoint
对象,可以通过
x()
y()
方法访问值

它们看起来就像元组,但它们一点也不像元组,您甚至无法使用
t[0]
访问单个坐标

也就是说,您可以使用

lst = [(p.x(), p.y()) for p in lst]
pickle.dump(lst, handle) 

您可能需要编写自己的代码来执行序列化(和解析),因为
sip.wrapper
无法实例化或子类,您无法对它们进行pickle。你需要用别的东西来代替它们。但是,您没有在问题中提供MCVE,因此此问题无法回答。此外,您没有将其存储在文本文件中,并且该词典不会导致pickleerror@nickan你需要提供一个!这并不是最低限度的。当您这样做时,您需要添加完整的异常回溯。@nickan抱歉,但不是。这不是一个可验证的示例。当我运行它时,我得到一个异常。我修复它,我得到另一个,然后另一个,然后另一个。。。请编写一段代码,当保存在文件中然后运行时会产生错误。请注意您是如何分配给
mydict
然后酸洗
distDict
的。根据您的答案读取保存的文件的正确方法是什么?如果我想读成
(x,y)
而不是
x()和y()
。你喜欢在新问题中问这个吗?@nickan如果你在文件中读到,它将是元组,而不是QgsPoints