Запись нескольких файлов .csv

У меня есть словарь, где item_dictionary[0] соответствует data[0], а item_dictionary[1] соответствует data[1].

item_dictionary = {'10350':'cat', '560':'dog'}
names = item_dictionary.values()

data = [[1, 2, 3, 4], [5, 6, 7]]

Я попытался записать элементы в data[0] и data[1] в разные файлы .csv следующим образом:

def writer(item):
    q = data.index(item)    
    myfile = open('%r.csv', 'wb') % names[q]
    wr = csv.writer(myfile)
    wr.writerows(data[q])
    myfile.close()

z = [writer(x) for x in data]

Это возвращает ошибку:

Трассировка (последний последний вызов):
Файл "", строка 1,
Файл "", строка 3, запись
TypeError: неподдерживаемые типы операндов для %: 'file' и ' стр'`.

Я предполагаю, что часть ошибки 'str' состоит в том, что names[q] возвращает, скажем, 'cat' вместо cat. Однако я не знаю, какой тип операнда использовать вместо этого, и не знаю, как обойти проблему str, поэтому может ли кто-нибудь помочь мне? Спасибо.


person Community    schedule 04.11.2012    source источник
comment
Предупреждение: в Python словари неупорядочены, и порядок отображения элементов в .values() является произвольным. Так что неверно, что item_dictionary[0] соответствует data[0], а item_dictionary[1] соответствует data[1] -- нет item_dictionary[0]. (Попробуйте и посмотрите — вы получите KeyError.) Существует отдельный упорядоченный тип словаря, но вы используете не его.   -  person DSM    schedule 04.11.2012
comment
Спасибо за внимание.   -  person    schedule 04.11.2012


Ответы (1)


open('%r.csv', 'wb') % names[q] должно быть open('%r.csv' % names[q], 'wb').

В первом случае вы открываете файл с именем "%r.csv" для записи в двоичном режиме, а затем пытаетесь по модулю объект файла с содержимым names[q]. Объекты file не поддерживают оператор по модулю, поэтому вы получаете TypeError.

В последнем случае мы вызываем метод format строки %r.csv с оператором модуля, результатом которого является строка, которая передается функции open.


Кроме того, вы можете рассмотреть другой способ связывания имен с данными — вы можете хранить имена вместе с данными либо в кортежах, либо в словарях, либо в экземплярах классов:

# Tuples
data = [("cat", [1, 2, 3, 4]), ("dog", [5, 6, 7])]
for name, file_data in data:
    print name, "=>", file_data

# Dictionary (assumes only one instance of name per data point)
data = {"cat": [1, 2, 3, 4], "dog": [5, 6, 7]}
for name, file_data in data.items():
    print name, "=>", file_data

# Class instances (ignore this one if you haven't done any OO before)
# (You don't need it if you don't *know* you need it).
class MyDataType(object):
    def __init__(self, name, data):
        self.name = name
        self.data = data

data = [MyDataType("cat", [1, 2, 3, 4]), MyDataType("dog", [5, 6, 7])]
for data_point in data:
    print data_point.name, "=>", data_point.data
person Sean Vieira    schedule 04.11.2012
comment
Ok. Это устранило одну проблему только для того, чтобы выявить еще один недостаток в моем коде. Теперь я получаю Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 5, in writer _csv.Error: sequence expected. - person ; 04.11.2012
comment
@ user1709173 - функция записи csv ожидает, что ей будет передан список списков (или, по крайней мере, итеративный итерируемый). Когда он пытается сделать следующее for row in data: for data_point in row: write_data(data_point), он находит сам пытается перебрать ints и взрывается. (for row in [1, 2, 3, 4]: for data_point in 1: # BOOM! (1 is not iterable)) - person Sean Vieira; 04.11.2012
comment
Итак, если data — это список списков, как мне создать csv, который содержит только один элемент из data вместо обоих? - person ; 04.11.2012
comment
Ok. Я понял. Я только что заархивировал data[q] и написал это. - person ; 04.11.2012