2

私はプログラミングの初心者で、Python を独学で学ぶことにしました。数日後、私は小さな部分をコーディングすることにしました。私はかなり単純です:

  • 今日の日付
  • 私がいるページ (私は本を読んでいます)
  • 私がどう感じるか
  • 次に、ファイルにデータを追加します。プログラムを起動するたびに、ファイルに新しいデータ行が追加されます
  • 次に、データを抽出してリストのリストを作成します。

真実は、リストをピクルしてからファイルをアンピクルするためにプログラムを書き直したかったということです。ただし、処理できないエラーに対処しているため、これを解決する方法を本当に知りたいです。したがって、あなたが私を助けてくれることを願っています:)

私は、この明らかに単純でばかげた問題について、過去数時間苦労してきました。私は解決策を見つけませんが。エラーとコードは次のとおりです。

エラー:

Traceback (most recent call last):
  File "dailyshot.py", line 25, in <module>
    SaveData(todaysline)
  File "dailyshot.py", line 11, in SaveData
    mon_pickler.dump(datatosave)
TypeError: must be str, not bytes

コード:

import pickle
import datetime

def SaveData(datatosave):
    with open('journey.txt', 'wb') as thefile:
        my_pickler = pickle.Pickler(thefile)
        my_pickler.dump(datatosave)
        thefile.close()

todaylist = []
today = datetime.date.today()
todaylist.append(today)

page = input('Page Number?\n')
feel = input('How do you feel?\n')

todaysline = today.strftime('%d, %b %Y') + "; " + page + "; " + feel + "\n"

print('Thanks and Good Bye!')

SaveData(todaysline)

print('let\'s make a list now...')

thefile = open('journey.txt','rb')
thelist = [line.split(';') for line in thefile.readlines()]
thefile.close()

print(thelist)

戦利品をありがとう!

4

2 に答える 2

1

わかりましたので、ここでコメントすることがいくつかあります。

  1. ステートメントを使用する場合with、ファイルを明示的に閉じる必要はありません。Python は、withブロックの最後 (8 行目) でそれを行います。

  2. 何にも使いませんtodayList。それを作成し、要素を追加してから、それを破棄します。だからそれはおそらく役に立たない:)

  3. なぜ文字列オブジェクトをピクルするのですか? 文字列がある場合は、そのままファイルに書き込みます。

  4. 書き込み時にデータをピクルする場合は、読み取り時にピクルを解除する必要があります。ピクルス化されたデータを書き込んでから、ファイルをプレーンテキストファイルとして読み取るだけではいけません。

  5. aファイルにアイテムを追加するだけの場合に追加に使用すると、ファイルw全体が上書きされます。

私が提案するのは、すべての行が 1 つのエントリであるプレーン テキスト ファイルを作成することです。

import datetime

def save(data):
    with open('journey.txt', 'a') as f:
        f.write(data + '\n')

today = datetime.date.today()
page = input('Page Number: ')
feel = input('How do you feel: ')

todaysline = ';'.join([today.strftime('%d, %b %Y'), page, feel])

print('Thanks and Good Bye!')
save(todaysline)

print('let\'s make a list now...')

with open('journey.txt','r') as f:
    for line in f:
        print(line.strip().split(';'))
于 2013-08-17T11:23:28.973 に答える
0

正しいコードを投稿したと確信していますか? ファイルを開くときに「b」を見逃すと、そのエラーが発生する可能性があります

例えば。

with open('journey.txt', 'w') as thefile:

>>> with open('journey.txt', 'w') as thefile:
...    pickler = pickle.Pickler(thefile)
...    pickler.dump("some string")
... 
Traceback (most recent call last):
  File "<stdin>", line 3, in <module>
TypeError: must be str, not bytes

ファイルはバイナリモードで開く必要があります

>>> with open('journey.txt', 'wb') as thefile:
...    pickler = pickle.Pickler(thefile)
...    pickler.dump("some string")
... 
>>> 
于 2013-08-17T11:35:09.223 に答える