質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.51%

  • Python

    8030questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Python 3.x

    6445questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

text file editing

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 143

xRein

score 2

python3 を使ってテキストfileの中の特定の1行だけを指定して消去することは可能でしょうか? できる限りパッケージなどを使わないでできる方法があれば教えていただきたいです。また、自分が書いたコードに改善点があればよければ教えてください。

def createfile():
    file_name = str(input('Enter the file name: '))
    try:
        score_file = open(file_name + '.txt', 'w')
        score_file.close()
    except:
        print('An error occured at creating.')
    else:
        print(file_name + '.txt is created')

def searchfile():
    file_name = str(input('Enter the file name which you want to see.: '))
    try:
        score_file = open(file_name, 'r')
        name = score_file.readline()
        while name != '':
            score = score_file.readline()
            name = name.rstrip('\n')
            score = score.rstrip('\n')
            print(name, score)
            name = score_file.readline()
    except:
        print('An error occured at adding.')

def addfile():
    try:
        file_name = str(input('Enter the file name which you want to add to.: '))
        add = '1'
        while add == '1':
            name = str(input('Enter a student name: '))
            score = str(input('Enter his/her score: '))
            score_file = open(file_name, 'a')
            score_file.write('Name:'+ name + '\n')
            score_file.write('Score:' + score + '\n')
            score_file.close()
            add = input('If you want to continue adding new data, press 1: ')
    except():
        print('An error occured at adding.')

def main():
    kc = 'y'
    while kc == 'y':
        press = input('Press 1 to create a new course score file.\nPress 2 to search into an existing course score file.\nPress 3 to add more scores to an existing course score file.: ')
        if press == '1':
            createfile()
        elif press == '2':
            searchfile()
        elif press == '3':
            addfile()

        kc = input('If you continue process press y: ')
    print ('Good Bye!')

main()
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • umyu

    2018/07/06 14:44

    プログラムのソースコードはcodeタグで囲ってくださいな。

    キャンセル

  • キャンセル

  • xRein

    2018/07/06 15:27

    ありがとうございます。不慣れで申し訳ないです。

    キャンセル

回答 2

+2

まず、全部の行を読み込み、特定の行をそこから削除し、改めて書き込む、という操作となりますね

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

+1

# -*- coding: utf-8 -*-

def createfile():
    file_name = str(input('Enter the file name: '))
    try:
        with open(file_name + '.txt', 'w', encoding='utf-8') as score_file:
            pass
    except:
        print('An error occured at creating.')
    else:
        print(file_name + '.txt is created')


def searchfile():
    file_name = str(input('Enter the file name which you want to see.: '))
    try:
        with open(file_name, 'r', encoding='utf-8') as score_file:

            name = score_file.readline()
            while name != '':
                score = score_file.readline()
                name = name.rstrip('\n')
                score = score.rstrip('\n')
                print(name, score)
                name = score_file.readline()
    except:
        print('An error occured at adding.')


def addfile():
    try:
        file_name = str(input('Enter the file name which you want to add to.: '))
        add = '1'
        while add == '1':
            name = str(input('Enter a student name: '))
            score = str(input('Enter his/her score: '))
            with open(file_name, 'a', encoding='utf-8') as score_file:
                score_file.write('Name:' + name + '\n')
                score_file.write('Score:' + score + '\n')
            add = input('If you want to continue adding new data, press 1: ')
    except():
        print('An error occured at adding.')

def deleteline():
    file_name = str(input('Enter the file name which you want to see.: '))
    with open(file_name, 'r', encoding='utf-8') as score_file:
        lines = score_file.readlines()
    line_n = int(input('Delete line.: '))
    with open(file_name, 'w', encoding='utf-8') as score_file:
        for i, line in enumerate(lines, start=1):
            if i == line_n:
                continue
            score_file.write(line)

def main():
    PROCESSING = {"1": createfile, "2": searchfile, "3": addfile, "4": deleteline}
    kc = 'y'
    while kc == 'y':
        msg = """Press 1 to create a new course score file.
Press 2 to search into an existing course score file.
Press 3 to add more scores to an existing course score file.: 
Press 4 to delete line: """
        press = input(msg)
        command = PROCESSING.get(press)
        if command is not None:
            command()
        kc = input('If you continue process press y: ')
    print ('Good Bye!')


if __name__ == "__main__":
    main()

その他改造点

  1. 例外発生時にもcloseが実行されるように、with文を使用。
  2. ファイルを読み書きするときは、環境依存を避けるためにencoding形式を明示的に指定。
  3. PROCESSING のdictでファイル作成/検索/追記を管理

ファイルで管理するなら、csvモジュールまたはjsonモジュール
頻繁に内容を書き換えるなら、sqliteで管理してもいいかと。


◇余談
以下の書き込み部分でもしも書き込み途中に何らかの障害(PCの電源断,アプリが落とされた,etc)が発生した時にファイルの元データがロストしてしまいます。

    with open(file_name, 'w', encoding='utf-8') as score_file:
        for i, line in enumerate(lines, start=1):
            if i == line_n:
                continue
            score_file.write(line)


ファイルが不整合な状態を防ぐにはトランザクション機能があるsqliteなどのデータベースで管理するが一番良いのですが、
別ファイル(tempfile — 一時ファイルやディレクトリの作成)に書き込み、最後にos.replaceで元ファイルにコピーしてくださいな。
これで削除処理はロストしますが、ファイルデータのロストはしないです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python

    8030questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Python 3.x

    6445questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。