2

改行を含む文字列を含むcsvファイルがいくつかあります。ファイルはExcelで問題なく開きますが、csv.DictReader()を使用してファイルを読み込もうとすると、csv.DictReader()は、文字列内の各改行を、キャリッジを無視するのではなく、新しいデータ行として処理するように見えます。文字列内で区切ります。

最初のテストと同じように、以下の2番目のテストに合格するにはどうすればよいですか?

#csv contents
this, is, a, test
1,2,u'thr\nee',4
5,6,7,8 

        result = []
        text = """this, is, a, test
1,2,u'three',4
5,6,7,8"""
        b = StringIO(text)
        reader = csv.DictReader(b)
        for row in reader:
                result.append(row)

        self.assertEqual(2,len(result))
        expected = [{'this': '1', ' test': '4', ' is': '2', ' a': "u'three'"}, {'this': '5', ' test': '8', ' is': '6', ' a': '7'}]
        self.assertEqual(expected ,result)

        #With a /n inside the string.

        result = []
        text = """this, is, a, test
1,2,u'thr\nee',4
5,6,7,8"""
        b = StringIO(text)
        reader = csv.DictReader(b)
        for row in reader:
                result.append(row)

        self.assertEqual(2,len(result))
        #expected = [{'this': '1', ' test': '4', ' is': '2', ' a': "u'thr\nee'"}, {'this': '5', ' test': '8', ' is': '6', ' a': '7'}]
        #self.assertEqual(expected,result)
4

1 に答える 1

3

csvコンテンツが適切に引用されていると仮定して、リーダーをインスタンス化するときに適切なquotecharを指定すると、次のようになります。

http://docs.python.org/release/2.6.7/library/csv.html#csv.Dialect.quotechar

それ以外の場合は、コンテンツにunix改行('\ n')があり、改行('\ r \ n')を行末記号として使用していると仮定します。Python 2.6.7の時点で、ドキュメントには、リーダーが、指定したものが何であれ、両方をラインターミターとして認識するようにハードコードされていると記載されています。Pythonバージョンの場合はわかりません。はいの場合は、ファイルを手動で前処理(場合によっては後処理)して、適切な引用符を確保するか、単一の「\ n」を別のものに置き換えてから、csv解析後に逆の処理を行う必要があります。

于 2012-06-01T13:56:02.963 に答える