2012-11-04 5 views
0

나는 item_dictionary[0]data[0]에 해당하고 item_dictionary[1]이 에 해당하는 사전이 있습니다. 'str' 부분에 대한여러 .csv 파일 쓰기

Traceback (most recent call last):
File "", line 1, in
File "", line 3, in writer
TypeError: unsupported operand type(s) for %: 'file' and 'str'`.

내 생각 엔 :이 오류를 반환

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] 

:

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

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

나는이 같은 다른 .CSV 파일에 data[0] 항목 및 data[1]를 작성하는 시도 의 오류는 names[q]cat 대신에 'cat'을 반환한다는 것입니다. 그러나 대신 어떤 피연산자 유형을 사용해야할지 모르며 str 문제를 해결하는 방법을 모르는 경우 누군가 도와 주시겠습니까? 감사.

+2

경고 : 파이썬에서는 사전이 정렬되지 않고'.values ​​() '에 나타나는 요소의 순서는 임의적입니다. 따라서 item_dictionary [0]은 data [0]에 해당하고 item_dictionary [1]은 data [1]에 해당합니다. * item_dictionary [0]'은 없습니다. (시도해보십시오 - KeyError가 발생합니다.) 별도의 순서가 지정된 사전 유형이 있지만 사용중인 것은 아닙니다. – DSM

+0

머리를 주셔서 감사합니다. –

답변

3

open('%r.csv', 'wb') % names[q]open('%r.csv' % names[q], 'wb')이어야합니다.

전자의 경우 바이너리 모드로 쓰고 나서 names[q]의 내용으로 파일 개체를 모듈화하려고 "% r.csv"라는 파일을 여는 중입니다. file 개체는 모듈러스 연산자를 지원하지 않으므로 TypeError이 표시됩니다.

후자의 경우 문자열 %r.csvformat 메서드를 모듈 연산자와 함께 호출하여 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 
+0

확인. 이 문제는 내 코드의 또 다른 결함을 나타 내기 위해서만 수정되었습니다. 'Traceback (가장 최근의 마지막 통화) : 파일 "", 줄 1, 파일 "", 줄 5, 작성자 _csv.Error : sequence expected'에 있습니다. –

+0

@ user1709173 - csv 작성기 함수는리스트 * (또는 적어도 iterables *의 iterables *를 전달할 iterables *)의리스트를 기대합니다. 행에서 data_point에 대해 다음을 수행하려고 시도 할 때 : write_data (1, 2, 3, 4의 행 : 1의 데이터 포인트 : # BOOM! (1은 반복 불가)') –

+0

만약'data'가리스트의리스트라면, 어떻게 두 아이템 대신에'data' 아이템 하나만을 포함하는 CSV를 생성할까요? –