Skip to content

Commit 4a6eec7

Browse files
committed
[processing] use csv module for table writer
1 parent 6689964 commit 4a6eec7

File tree

1 file changed

+42
-18
lines changed

1 file changed

+42
-18
lines changed

python/plugins/processing/core/TableWriter.py

+42-18
Original file line numberDiff line numberDiff line change
@@ -23,29 +23,53 @@
2323
# This will get replaced with a git SHA1 when you do a git archive
2424
__revision__ = '$Format:%H$'
2525

26-
from qgis.core import *
27-
28-
from PyQt4.QtCore import *
26+
import csv
27+
import codecs
28+
import cStringIO
2929

3030
class TableWriter:
31-
3231
def __init__(self, fileName, encoding, fields):
3332
self.fileName = fileName
34-
self.writer = None
33+
if not self.fileName.lower().endswith("csv"):
34+
self.fileName += ".csv"
3535

36-
if encoding is None:
37-
settings = QSettings()
38-
encoding = settings.value("/ProcessingQGIS/encoding", "System")
36+
self.encoding = encoding
37+
if self.encoding is None or encoding == "System":
38+
self.encoding = "utf-8"
3939

40-
if not fileName.endswith("csv"):
41-
fileName += ".csv"
42-
file = open(fileName, "w")
43-
file.write(";".join(unicode(field.name()) for field in fields))
44-
file.write("\n")
45-
file.close()
40+
with open(self.fileName, "wb") as csvFile:
41+
self.writer = UnicodeWriter(csvFile, encoding=self.encoding)
42+
self.writer.writerow(fields)
4643

4744
def addRecord(self, values):
48-
file = open(self.fileName, "a")
49-
file.write(";".join([unicode(value) for value in values]))
50-
file.write("\n")
51-
file.close()
45+
with open(self.fileName, "ab") as csvFile:
46+
self.writer = UnicodeWriter(csvFile, encoding=self.encoding)
47+
self.writer.writerow(values)
48+
49+
def addRecords(self, records):
50+
with open(self.fileName, "ab") as csvFile:
51+
self.writer = UnicodeWriter(csvFile, encoding=self.encoding)
52+
self.writer.writerows(records)
53+
54+
class UnicodeWriter:
55+
def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds):
56+
self.queue = cStringIO.StringIO()
57+
self.writer = csv.writer(self.queue, dialect=dialect, **kwds)
58+
self.stream = f
59+
self.encoder = codecs.getincrementalencoder(encoding)()
60+
61+
def writerow(self, row):
62+
row = map(unicode, row)
63+
try:
64+
self.writer.writerow([s.encode("utf-8") for s in row])
65+
except:
66+
self.writer.writerow(row)
67+
data = self.queue.getvalue()
68+
data = data.decode("utf-8")
69+
data = self.encoder.encode(data)
70+
self.stream.write(data)
71+
self.queue.truncate(0)
72+
73+
def writerows(self, rows):
74+
for row in rows:
75+
self.writerow(row)

0 commit comments

Comments
 (0)