0

細かい名前とそのリストを別のCSVファイルに置き換えたり、csvファイル自体を置き換えて同じ内容で上書きしたりしたいです。
関数コマンドは save_friends('data.csv', load_friends('data.csv')) である必要があります

def save_friends(friend_info, new_list):
    with open(friend_info, 'w') as f:
        for line in new_list:
            f.write(line + '\n')

この関数を使用すると、このエラー TypeError: can only concatenate tuple (not "str") to tuple が発生します

だから私はv.append(tuple(line))上に追加しましf.write(line + '\n')た、そしてそれは基本的に空のデータでファイルを上書きします。この機能を動作させるにはどうすればよいですか?

4

1 に答える 1

1

new_listタプルオブジェクトを含むイテラブルであるように私には見えます。そのため、次のように連結することはできませんstr:

>>> ("foo","bar") + "\n"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate tuple (not "str") to tuple

典型的なアプローチは、str.joinと連結tupleするstr 前にを に結合すること"\n"です。例えば:

>>> ','.join(("foo","bar")) + "\n"
'foo,bar\n'

したがって、それをコードに適用すると、次のようになります。

def save_friends(friend_info, new_list):
    with open(friend_info, 'w') as f:
        for line in new_list:
            f.write(','.join(line) + '\n')

の要素が何であるかによってlineは、さらに一歩進んで、タプル内の各要素も であることを確認する必要がある場合がありますstr

f.write(','.join(str(x) for x in line) + '\n')

join文字列ではない要素に遭遇した場合、それは不平を言うからです:

>>> ','.join((1,2,3))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: sequence item 0: expected string, int found
于 2013-04-09T12:29:05.790 に答える