Python:一次读取两个元组数组并将它们并排放置在CSV-fi上

2024-10-03 06:21:17 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我有两个元组数组,它们以餐厅名称和Int排列:

("Restaurant Name", 0)

一个称为ArrayForInitialSpots,另一个称为ArrayForChosenSpots。我要做的是在csv文件中以并排顺序写入两行的元组,如下所示:

"First Restaurant in ArrayForInitialSPots",0,"First Restaurant in ArrayForChosenSpots", 1

"Second Restaurant in ArrayForInitialSpots",0,"Second Restaurant in ArrayForChosenSpots",0

到目前为止,我试过这样做:

with open('data.csv','w') as out:
        csv_out=csv.writer(out)
        csv_out.writerow(['Restaurant Name','Change'])
        for x, y in zip(arrayForInitialSpots, arrayForChosenSpots):
            csv_out.writerow(x + y)
            #csv_out.writerow(y)

但我得到:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 3-6: ordinal not in range(128)

如果我删除zip函数,就会得到too many values to unpack。有什么建议吗?事先非常感谢。你知道吗


Tags: csvnamein名称数组zipout餐厅
3条回答

有了mhawke的帮助,这里是我的解决方案

with open('data.csv','w') as out:
   csv_out=csv.writer(out)
   csv_out.writerow(['Restaurant Name','Change'])
   for x, y in zip(arrayForInitialSpots, arrayForChosenSpots):
      list_ = [str(word).decode("utf8") for word in (x+y)]
      counter = 0
      while counter < len(list_):
         s=""
         for i in range(counter,counter+4):
            s+=list_[i].encode('utf-8')
            s+=","
         counter = counter + 4
      csv_out.writerow(s[:-1])

在写入文件时,有两种方法可用于处理扩展ascii字符:

  1. 将默认编码设置为utf-8

    import sys reload(sys).setdefaultencoding("utf-8")

  2. 使用unicodesv writer将数据写入文件 import unicodecsvunicodecsv

这个问题并不是因为使用了zip()-看起来没问题,而是编码问题。餐厅名称可能是unicode字符串,或者是ASCII或UTF8以外的编码?可能是ISO-8859-1?你知道吗

csv模块不处理unicode;其他编码可能可以工作,但这取决于具体情况。该模块确实可以处理8位值(ASCII NUL除外),因此您应该能够将它们编码为UTF8,如下所示:

ENCODING = 'iso-8859-1'    # assume strings are encoded in this encoding

def to_utf8(item, from_encoding):
    if isinstance(item, str):
        # byte strings are first decoded to unicode
        item = unicode(item, from_encoding)
    return unicode(item).encode('utf8')

with open('data.csv', 'w') as out:
    csv_out = csv.writer(out)
    csv_out.writerow(['Restaurant Name', 'Change'] * 2)
    for x, y in zip(arrayForInitialSpots, arrayForChosenSpots):
        csv_out.writerow([to_utf8(item, ENCODING) for item in x+y])

其工作原理是将x+y形成的元组的每个元素转换为UTF-8字符串。这包括其他编码中的字节字符串,以及可以通过unicode()转换为unicode字符串的其他对象,如整数。如果字符串是unicode,只需将ENCODING设置为None。你知道吗

相关问题 更多 >