引用符で囲まれていないフィールドエラーでCSV改行文字が見られる


121

次のコードは、今日までWindowsマシンからインポートしてこのエラーが発生するまで機能していました。

引用符で囲まれていないフィールドに改行文字が表示される-ファイルをユニバーサル改行モードで開く必要がありますか?

import csv

class CSV:


    def __init__(self, file=None):
        self.file = file

    def read_file(self):
        data = []
        file_read = csv.reader(self.file)
        for row in file_read:
            data.append(row)
        return data

    def get_row_count(self):
        return len(self.read_file())

    def get_column_count(self):
        new_data = self.read_file()
        return len(new_data[0])

    def get_data(self, rows=1):
        data = self.read_file()

        return data[:rows]

この問題を解決するにはどうすればよいですか?

def upload_configurator(request, id=None):
    """
    A view that allows the user to configurator the uploaded CSV.
    """
    upload = Upload.objects.get(id=id)
    csvobject = CSV(upload.filepath)

    upload.num_records = csvobject.get_row_count()
    upload.num_columns = csvobject.get_column_count()
    upload.save()

    form = ConfiguratorForm()

    row_count = csvobject.get_row_count()
    colum_count = csvobject.get_column_count()
    first_row = csvobject.get_data(rows=1)
    first_two_rows = csvobject.get_data(rows=5)

以下のrectummelancoliqueの答えは、私の同様の問題を解決したものです。stackoverflow.com/a/17315726/3131666
kmantel

回答:


181

csvファイル自体を表示することは良いことですが、これはうまくいくかもしれません。試してみて、置き換えてください。

file_read = csv.reader(self.file)

と:

file_read = csv.reader(self.file, dialect=csv.excel_tab)

または、次のようにしてファイルを開き、にuniversal newline mode渡しますcsv.reader

reader = csv.reader(open(self.file, 'rU'), dialect=csv.excel_tab)

または、次のsplitlines()ようにを使用します。

def read_file(self):
    with open(self.file, 'r') as f:
        data = [row for row in csv.reader(f.read().splitlines())]
    return data

これで同じエラーが発生しますが、upload.num_records = csvobject.get_row_count()を開始する行で
GrantU

1
そして、分割線バージョンを試してみると(これは非常にクールです)、Unicodeに強制変換されます。文字列またはバッファが必要です。S3BotoStorageFileが見つかりました
GrantU

4
最終的にはどのオプションが機能しましたか?ところで、あなたはファイルを2回読んでいます:内get_row_count()と内get_column_count()-ファイルを読ん__init__で覚えdataself.dataから、他の方法でそれを使用してください。
alecxe 2013年

splitlines()の+1。これにより、OSXでのさまざまなフォーマットオプションの変更を回避できます。他のプラットフォームでも動作することを願っています...
python1981

すばらしい答えです。ただし、「dialect = csv.excel_tab」を使用すると、csv.DictReaderと一緒に使用すると出力が台無しになります。「rU」オプションだけでも魔法のように機能します
マーフィー

52

これは古い投稿であることに気づきましたが、同じ問題に遭遇し、正解が表示されなかったので、試してみます

Pythonエラー:

_csv.Error: new-line character seen in unquoted field

Macintosh(OS X以前のフォーマット)CSVファイルを読み取ろうとしたことが原因で発生します。これらは、行末にCRを使用するテキストファイルです。MS Officeを使用している場合は、プレーンCSV形式またはCSV(MS-DOS)を選択してください。CSV(Macintosh)を名前を付けて保存タイプとして使用しないでください

私の推奨するEOLバージョンはLF(Unix / Linux / Apple)ですが、MS Officeがこの形式で保存するオプションを提供しているとは思いません。


4
MS DOSカンマ区切りは機能しませんでしたが(同じエラー)、Windowsカンマ区切りです。
tmthyjames

3
Macを使用している場合、これが正解です。
HashHazard

OS Xでも同じ問題が発生します。新しいCSVファイルを作成する必要があります。現在のものをプレーンCSV形式またはCSV(MS-DOS)として保存するだけでは問題は解決しません。
パイダーマン2016

1
OS Xでは、Windowsカンマ区切りのcsvは機能しましたが、MS DOSカンマ区切りは機能しませんでした。
user2348114 2017

31

Mac OS Xの場合、CSVファイルを「Windowsカンマ区切り(.csv)」形式で保存します。


1
ありがとう、私はMac w / MSオフィスを使っているので、それは必要な材料でした。
トラベリング

18

Macでこれが起こった場合(私と同じように):

  1. ファイルに名前を付けて保存します CSV (MS-DOS Comma-Separated)
  2. 次のスクリプトを実行します

    with open(csv_filename, 'rU') as csvfile:
        csvreader = csv.reader(csvfile)
        for row in csvreader:
            print ', '.join(row)

2
あなたは私の世界を揺さぶった。
kta

5

dos2unix最初にWindowsインポートファイルで実行してみてください


ユーザーが特別な変更をせずにWindowsとMacの両方からcsvをアップロードできるようにするために本当に必要なオプションはありません。インポートはExcel(Windows)からCSVとして保存されたので、これらを読み取るためにPythonで実行する必要がある特別なことがあるのではないでしょうか?
GrantU 2013年

@GrantUあなたは、Mac OS 9以前ではなく、Mac OS X 10.0以降を参照していますか?9と10の間で、Mac OSは\x0d(ProDOS)行末から\x0a(UNIX)行末に切り替わりました。
Damian Yerrick 2016年

2

これは私が直面したエラーです。MAC OSXで.csvファイルを保存しました。

保存するときは、問題を解決した「Windowsカンマ区切り値(.csv)」として保存してください。


1

これはOSXでは私にとってはうまくいきました。

# allow variable to opened as files
from io import StringIO

# library to map other strange (accented) characters back into UTF-8
from unidecode import unidecode

# cleanse input file with Windows formating to plain UTF-8 string
with open(filename, 'rb') as fID:
    uncleansedBytes = fID.read()
    # decode the file using the correct encoding scheme
    # (probably this old windows one) 
    uncleansedText = uncleansedBytes.decode('Windows-1252')

    # replace carriage-returns with new-lines
    cleansedText = uncleansedText.replace('\r', '\n')

    # map any other non UTF-8 characters into UTF-8
    asciiText = unidecode(cleansedText)

# read each line of the csv file and store as an array of dicts, 
# use first line as field names for each dict. 
reader = csv.DictReader(StringIO(cleansedText))
for line_entry in reader:
    # do something with your read data 

1

これはかなり前から回答されていますが、私の問題は解決していません。他のいくつかの複雑さのため、csvの読み取りにDictReaderとStringIOを使用しています。区切り文字を明示的に置き換えることで、問題をより簡単に解決できました。

with urllib.request.urlopen(q) as response:
    raw_data = response.read()
    encoding = response.info().get_content_charset('utf8') 
    data = raw_data.decode(encoding)
    if '\r\n' not in data:
        # proably a windows delimited thing...try to update it
        data = data.replace('\r', '\r\n')

巨大なCSVファイルの場合は妥当ではないかもしれませんが、私のユースケースではうまく機能しました。


それは、おかげで私の問題を解決しました見て!ここに
AOF

0

別の高速な解決策:私は同じエラーに直面しました。私は、lubuntuマシンのGNUMERICで「奇妙な」csvファイルを再度開き、csvファイルとしてエクスポートしました。これで問題が修正されました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.