2017-09-03 99 views
-1

我想將文本文件中的所有x ad 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 

有什麼辦法XY列表轉換爲文本文件,並回讀它在數字格式不str的?

+0

你可能需要編寫自己的事情做的序列化(和解析) –

+3

因爲'sip.wrapper轉換成元組的列表'不能實例化或分類不能使用這些。你需要用別的東西替換它們。然而,你沒有提供問題的MCVE所以這個問題是無法回答的 –

+2

此外,你沒有存儲在一個文本文件,該字典不會導致鹹菜錯誤 –

回答

1

最簡單的方法是放棄使用QgsPoint(xp, yp)並使用元組,而不是使用元組,即(xp, yp)。看來QgsPoint是一個C++類的SIP包裝器; SIP封裝器不會知道酸洗。

還要注意的是pyqgis documentation這樣說:

Note

The tuples (x,y) are not real tuples, they are QgsPoint objects, the values are accessible with x() and y() methods.

他們只是看起來像元組,但他們沒有像元組,你甚至不能訪問與t[0]個人座標。

這就是說,你可以這樣點的列表很容易與

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

非常感謝:),你是專業的程序員。 – nickan

+0

什麼是根據您的答案閱讀保存的文件的正確方法?如果我想讀爲'(x,y)'而不是'x()和y()'。你更喜歡在新問題中提出這個問題嗎? – nickan

+1

@nickan如果你在文件中讀取,它將是元組,而不是QgsPoints –

相關問題