2017-07-21 17 views
1

repl.itにはコードの実行に不一致があります(これはうまくいきますが、Pythonのバグが修正/更新されたため)、IDLEではコードが動作しません正しく各行の後に追加のリストが追加されました

ドキュメントを参照し、以前のスタックオーバーフローの回答で「改行」を追加しましたが、問題は解決しません。

あなたはここで、REPLそれに気付くでしょう。(作品完璧)

https://repl.it/Jbv6/0

しかし、IDLE中(改行なし)ファイルの内容を貼り付けるにはそれが正常に動作し

001,Joe,Bloggs,Test1:99,Test2:100,Test3:1002,Ash,Smith,Test1:20,Test2:20,Test3:100003003,Jonathan,Peter,Test1:99,Test2:33,Test3:44 

ただし、(新しい行の各レコードで)次のようにファイルの内容をtxtファイルに貼り付けます。

001,Joe,Bloggs,Test1:99,Test2:100,Test3:1 
002,Ash,Smith,Test1:20,Test2:20,Test3:100003 
003,Jonathan,Peter,Test1:99,Test2:33,Test3:44 

出力上のエラー、次のように(各行の後に新しいリストを作成)されます。コードはここにある

[['001', 'Joe', 'Bloggs', 'Test1:99', 'Test2:100', 'Test3:1'], [], ['002', 'Ash', 'Smith', 'Test1:20', 'Test2:20', 'Test3:100'], ['003'], ['', 'Jonathan', 'Peter', 'Test1:99', 'Test2:33', 'Test3:44']] 

import csv 

    #==========1. Open the File, Read it into a list, and Print Contents 
    print("1==============Open File, Read into List, Print Contents") 
    #open the file, read it into a list (each line is a list within a list, and the end of line spaces are stripped as well as the individual elements split at the comma) 
    with open("studentinfo.txt","rb",newline="") as f: 
     studentlist=list(csv.reader(f)) 

     print(studentlist) 

私が試してみました、としてドキュメント、およびstackoverflowの以前の答えは、を追加します:(改行)

with open("studentinfo.txt","r",newline="") as f: 

残念ながらエラーが続く。

説明付きの提案や解決策があれば幸いです。

更新は、私もこの試みた:それはreplit

https://repl.it/Jbv6/2

で完璧に動作しますが、再び

with open("studentinfo.txt",newline="") as f: 
    reader=csv.reader(f) 
    for row in reader: 
    print(row) 

をIDLE

1==============Open File, Read into List, Print Contents 
['001', 'Joe', 'Bloggs', 'Test1:99', 'Test2:100', 'Test3:1'] 
[] 
['002', 'Ash', 'Smith', 'Test1:20', 'Test2:20', 'Test3:100'] 
['003'] 
['', 'Jonathan', 'Peter', 'Test1:99', 'Test2:33', 'Test3:44'] 
>>> 
01でこのエラー

これは、repl.itとIDLEの両者で、学校と家庭環境の間で作業していることが一貫している必要がある学生にとって大きな問題です。

両方で動作するようにするコードを示す回答は、私が後にしているものです。フィルタを使用して

+0

あなたは、実際のバイト数を表示する必要が – MissComputing

+0

誰?誰?私は 'csv'モジュールによって解析されたCSV形式はCRLFを必要とすると信じていますプラットフォームにかかわらず、行の終わり。 –

+0

あなたは解決策を投稿してください - 私はそれが何を意味するか分かりません。ありがとう –

答えて

1

最も簡単です答えは以下の通りです:

import csv 

# ==========1. Open the File, Read it into a list, and Print Contents 
print("1==============Open File, Read into List, Print Contents") 
# open the file, read it into a list (each line is a list within a list, 
# and the end of line spaces are stripped as well as the individual 
# elements split at the comma) 
studentlist = [] 
with open("studentinfo.txt", "r", newline="") as f: 
    for row in csv.reader(f): 
     if len(row) > 0: 
      studentlist.append(row) 
print(studentlist) 

しかし、あなたの元のコードは動作するはずです - 私はそれを実行するが、LinuxではなくWindows上でてきました。私はより多くの仕事をするためにあなたを求めることができる場合:

with open("studentinfo.txt", "r", newline="") as f: 
    ascii_ch = list(map(ord,f.read())) 
    eol_delims = list(map(str,(ch if ch < 32 else '' for ch in ascii_ch))) 
    print(",".join(eol_delims)) 

これは,のリストを生成しますが13,10または10のいずれかが点在しますが、おそらくは10,13,10のようなものだろう。これらは\r\n\nですが、どうにかしてその3番目のオプションを手に入れたのだろうかと思っています。 もしそうなら、通常の行末を得るためには、そのテキストファイルを書き直す必要があると思います。

から
私は10,13,10に関するしているだけアドバイス一つだけのアプリケーション(たとえば、メモ帳)でテキストファイルを編集することです(応答での更新はコメントする)、および他の中でそれを編集することはありません。

実際の問題は、2つのアプリケーションでファイルを編集することです(それぞれのウィンドウのアプリケーションは\r\nでなければなりません。 "repl.it"は\nです)。前に、決して必要な一連のアクションを働いた。

+0

ありがとうグレン!最初の、そして最も簡単な提案(私は思った)は働いたが、実際にはリストの間に7を生成する。もっと謎! ['001'、 'Joe'、 'Bloggs'、 'Test1:99'、 'Test2:100'、 'Test3:1']、['7']、['002'、 'Ash'、 'Smith '、' Test1:20 '、' Test2:20 '、' Test3:100 ']] – MissComputing

+0

2番目のコードでは、これが生成されます:,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,, 10,13,10 ,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,, >>> – MissComputing

+0

私は7が基本的に最初の行の最後の文字であることが分かりますファイルには、001、Joe、Bloggs、Test1:99、Test2:100、Test3:17 002、Ash、Smith、Test1:20、Test2:20、Test3:100が含まれますが、なんらかの理由で001 、Joe、Bloggs、Test1:99、Test2:100、Test3:1 002、Ash、Smith、Test1:20、Test2:20、Test3:100 – MissComputing

-1

は助けることがあります。

with open('studentinfo.txt', 'rU') as f: 
    filtered = (line.replace('\r', '') for line in f) 
    for row in csv.reader(filtered): 
     print(row) 
+0

これは知っている(フィルタリングする)のですが、それでもうまくいきません。 – MissComputing

+0

これは、次のいずれかの理由で動作しません:csvread = csv.reader(f、dialect = 'unix'間違っています:ファイルの各行に新しい 'csv.reader'オブジェクトをインスタンス化する必要はありません! –

+0

誰かが"ファイル内のバイトが間違っている "ことを示唆しています。 – MissComputing

-1

は、テキストエディタに文字列をペーストして、ファイルを保存し、異なるプラットフォーム上でバイト同一のファイルを生成しません。

しかし、csvモジュールで受け入れられたCSV形式は、バイト厳密表現で指定されています(同じプラットフォーム上の異なるエディタでも一致しません)。この振る舞いは、方言(組み込みの方言または新しい方言の実装)を使用してカスタマイズすることができます。詳細は、Python documentationを参照してください。デフォルトの方言は、Windowsスタイルの行末(CR/LF)を必要とするexcelです。ファイルを別の形式で保存すると、正しく解析されません。

+0

私はこれをdownvoteしたくない...しかし、問題の簡単な解決策を貼り付けることなく、動作するコードでは、これは全く役に立ちません – MissComputing

+0

私はOPに同意します - 詳細については、Pythonのマニュアルを参照してください役立たない!あなたは正しいかもしれませんが、あなたはsolu使用することができますか? –

+0

@MissComputing:コードを書くつもりはありません。私はあなたの質問に答えています。私はすでに私があなたを助けるためにここで後方に曲がったように感じています。私自身の時間に、私の心の優しさからあなたを助けていることを覚えておいてください。 –

1

てみ使用コーデックと明示的にUTF-8へのファイルのエンコーディングを指定します。

import csv 
import codecs 

print("1==============Open File, Read into List, Print Contents") 
with codecs.open("studentinfo.txt",encoding='utf-8') as f: 
    studentlist=list(csv.reader(f)) 

    print(studentlist) 
+0

これを試してみました - ありがとう - 残念なことに同じ結果を生み出します – MissComputing

関連する問題