Python 使用csv.writer从savReader写入字节,无日期到浮点转换
我想从.sav SPSS文件中读取数据,并将其重写为.csv以供进一步使用。对于读取,我使用savReaderWriter.SavReader,它以字节表示法返回所有字符串:b'string'而不是'string' 以下是我在python 3.6中的代码: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
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