Multiple threads writing to the same CSV in Python

后端 未结 3 1821
栀梦
栀梦 2020-12-08 23:53

I\'m new to multi-threading in Python and am currently writing a script that appends to a csv file. If I was to have multiple threads submitted to an concurrent.future

3条回答
  •  一生所求
    2020-12-09 00:08

    here is some code, it also handles the headache-causing unicode issue:

    def ensure_bytes(s):
        return s.encode('utf-8') if isinstance(s, unicode) else s
    
    class ThreadSafeWriter(object):
    '''
    >>> from StringIO import StringIO
    >>> f = StringIO()
    >>> wtr = ThreadSafeWriter(f)
    >>> wtr.writerow(['a', 'b'])
    >>> f.getvalue() == "a,b\\r\\n"
    True
    '''
    
        def __init__(self, *args, **kwargs):
            self._writer = csv.writer(*args, **kwargs)
            self._lock = threading.Lock()
    
        def _encode(self, row):
            return [ensure_bytes(cell) for cell in row]
    
        def writerow(self, row):
            row = self._encode(row)
            with self._lock:
                return self._writer.writerow(row)
    
        def writerows(self, rows):
            rows = (self._encode(row) for row in rows)
            with self._lock:
                return self._writer.writerows(rows)
    
    # example:
    with open('some.csv', 'w') as f:
        writer = ThreadSafeWriter(f)
        writer.write([u'中文', 'bar'])
    

    a more detailed solution is here

提交回复
热议问题