2017-06-15 7 views
1

csvファイルからExcelファイルを作成しようとしています。私のCSVファイルの様子は次のとおりです。Pythonでcsvモジュールを使用してcsvファイルを解析中にこの行のデータが正しくない場合、行をスキップするには

|T|,|T|,|T|,|T| 
    |A|,|B|,|C|,|D| 
    |E|,|F|,|G|,|H| 
    |I|,|J|,|K|,|L| 
    |M|,|N|,|O 
    |Q|,|R|,|S|,|T| 
    |U|,|V|,|W|,|X| 
    |Y|,|Z 
    |A|,|B|,|C|,|D| 

私はセパレータとして使用しています。引用符文字やファイルを生成するには、次のスクリプトを使用して:

import csv 
from xlsxwriter.workbook import Workbook 
mydelimiter = ',' 
myquotechar = '|' 
with open('abcd.csv', 'rb') as csvfile: 
    reader = csv.reader(csvfile, delimiter=mydelimiter, quotechar=myquotechar) 
    workbook = Workbook('abcd.xlsx', {'strings_to_urls': False}) 
    worksheet = workbook.add_worksheet() 
    for r, row in enumerate(reader): 
     for c, col in enumerate(row): 
      worksheet.write(r,c,col) 
    workbook.close() 

ここで何が起こっているが、行番号5を解析中に、読者がで次のクォート文字と区切り、次の行の行NUMER 5を挿入し、6を見つけるために続けていることですExcelファイルの1行。私の質問は、それが正しいフォーマットまたはストップリーダーではない場合、どのように我々は次の行を考慮から行をスキップすることができますが、唯一の代わりにそこにラインを終了している

Line No. 5: M N "O{newline character here}Q|" R S T 

ように私のExcelファイル内の行番号5が見えます。 私のcsvのデータには{改行文字}はありませんが、一部の行には終了符文字と一部の列がありません(行番号5、3列目は| O | 4列目| P |が欠落しているはずです) 。ここ は、私は私のExcelファイルが見えるようにしたいものです。

Line No. 5: M N O (I am good with or without this line in excel.) 
    Line No. 6: Q R S T 

とアルネ・S.によって提供されたリンクで提案されているように reader = csv.reader(csvfile, delimiter=mydelimiter, quotechar=myquotechar, lineterminator='\n') どちらか動作しません。

+1

Pythonでcsvファイルを読み込んでいるときに[文字列の中に改行を入れていますか?](https://stackoverflow.com/questions/11362667/getting-newline-inside-string-while-reading-the-csv) -file-in-python) –

+0

実際には、私は上記のリンクで尋ねられているものとはまったく反対です。私のデータには改行文字はありません。私は次の行に進みたくありません。 'csv.reader()'に '\ n 'としてlineterminatorを与えるだけでは機能しません。 –

答えて

0

処理する前に正しい行数をテストすることができます。

with open('abcd.csv', 'rb') as csvfile: 
    reader = csv.reader(csvfile, delimiter=mydelimiter, quotechar=myquotechar) 
    workbook = Workbook('abcd.xlsx', {'strings_to_urls': False}) 
    worksheet = workbook.add_worksheet() 
    for r, row in enumerate(reader): 
     # would only work if we have constant number of columns for all rows. 
     if len(row) != 4: continue 
     for c, col in enumerate(row): 
      worksheet.write(r,c,col) 
    workbook.close() 
+0

TypeErrorを取得しました: 'int'型のオブジェクトにlen()はありません.rは整数型で、len()は適用されません。 –

+0

私は一度も列挙を使用していないので、構文は不慣れです。 rowがデータの実際の行である場合、 'if len(row)!= 4:continue'を使用して、それが動作するかどうかを確認してください。もしそうなら、私は答えを編集します。 –

+0

それは動作します(Excelから行を省略します)、ありがとう。私は既にソリューションがここに投稿されることを発見しました。私はあなたにもあなたの答えを編集するよう依頼します(r - >行)。 –

0

私は答えを見つけました。

読み込みオブジェクトの作成中に次の行を使用すると、csv readerをpythonで強制的に引用符文字の特別な処理を行わないようにすることができます。

reader = csv.reader(csvfile, delimiter=mydelimiter, quotechar=myquotechar, quoting=csv.QUOTE_NONE)

csv.QUOTE_NONEは引用符の特別な処理を実行しない読者に指示します。

この方法では、不完全な行はスキップしませんが、特定の行のExcelの列数が減少します。

また、@ {James C. Taylor}さんの回答は、不完全なデータを必要とせず、csvファイルの列数を固定している場合に機能します。

関連する問題