Python 使用csv.writer从savReader写入字节,无日期到浮点转换

Python 使用csv.writer从savReader写入字节,无日期到浮点转换,python,csv,utf-8,spss,Python,Csv,Utf 8,Spss,我想从.sav SPSS文件中读取数据,并将其重写为.csv以供进一步使用。对于读取,我使用savReaderWriter.SavReader,它以字节表示法返回所有字符串:b'string'而不是'string' 以下是我在python 3.6中的代码: import savReaderWriter import csv with savReaderWriter.SavReader('input_filename.sav') as reader: header = reader.he

我想从.sav SPSS文件中读取数据,并将其重写为.csv以供进一步使用。对于读取,我使用savReaderWriter.SavReader,它以字节表示法返回所有字符串:b'string'而不是'string'

以下是我在python 3.6中的代码:

import savReaderWriter
import csv

with savReaderWriter.SavReader('input_filename.sav') as reader:
    header = reader.header
    with open('output_filename.csv','w',newline='') as output:
        w = csv.writer(output,delimiter=',')
        w.writerow(header)
        for line in reader:
            w.writerow(line)
我发现的一个解决方案是在SavReader中指定ioUtf8=True,但随后所有日期变量都转换为float:b'2017-09-02'变为13723689600.0,然后由datetime.fromtimestamp读取为2404年

另一个有效的方法是

w.writerow([h.decode('utf-8') for h in header])
但仅适用于标题,因为其他行包含浮点和nan-s,因此会产生错误

在open中指定“wb”而不是“w”也会返回错误:

TypeError: a bytes-like object is required, not 'str'

有没有关于如何正确读写此类数据的想法?

我找到了一个临时解决方案,尽管我并不为此感到自豪。也许其他人可以改进它

import savReaderWriter
import csv

utf_errors = 0
with savReaderWriter.SavReader('input_filename.sav') as reader:
    header = reader.header
    header = [h.decode('utf-8') for h in header]
    with open('output_filename.csv','w',newline='') as output:
        w = csv.writer(output,delimiter=',')
        w.writerow(header)
        for line in reader:
            newline = []
            for l in line:
                try:
                    newline += [l.decode('utf-8')]
                except AttributeError:
                    # for non-string (floats and nan-s)
                    newline += [l]
            try:        
                w.writerow(newline)
            except UnicodeEncodeError:
                    # omit row when an unknown character is found
                    utf_errors += 1
                    pass

read_output = pd.read_csv(path+'output_filename.csv', encoding='latin1') 
数据的奇怪之处在于,无论我如何解码,总是有无法读取的符号。我发现它是最有效的。与之相比,decode'utf-8'省略了4行。decode'latin1'省略了29行,但我必须使用encoding='latin1'读取它,否则我会得到以下错误:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe9 in position 9: invalid continuation byte