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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python

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

Q&A

解決済

1回答

177閲覧

pythonのファイルについての質問です。

namikko

総合スコア20

Python

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

1グッド

0クリップ

投稿2019/04/12 11:50

編集2019/04/12 12:36

こんにちは。Pythonのファイルについての質問です。学校の課題でどうしても分からずにに困っております。。。
やりたいことは、
1、使用者にファイル名を聞く
2、そのファイルがなければそこで終了
3、もしそのファイルがあれば使用者に行を聞く
4、もし行がなければそこで終了
5、もしインプットしたデータ(行)が正しければそのインプットされた行から100行を新しいファイルに入力する。その時に単語の数も一緒にカウントする。

英語ではこのように書かれております。
Ask user to type the name of the file text. If the file does not exist, print a message and finish.

If the file exist, ask for the first row to be read. If there is no such row, print a message and finish.

If input data is correct, write 100 rows from the user's given number to a new file. Add word count to each row. If there is less than 100 rows, write as many as there are.

try, except , else を使うのはわかるのですが、どのようにコードを書いたらいいのか不明です。

プログラミング言語は必須で全くの初心者なのにこのような課題が出て頭を悩ませております。。
どなたかご教授をお願い申し上げます。
バージョンは3.7.2です。

kou0179👍を押しています

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

xebme

2019/04/12 12:10

rowは行です。the first row to be read. は、読むべき先頭の行です。(指定行) 存在するファイルの指定行から100行(なければあるだけ)新なファイルに書く。 word count は語数です。文字数ではない。訂正しましょう。 ヒント:ファイル入出力の方法を調べましょう。
kou0179

2019/04/12 12:13

課題に書かれている問題や資料はそれだけですか? 後、日本語訳は「列」でなく「行」のが良いと思います。 ITの世界では、 ・rowは、行(水平方向) ・columnは、列(垂直方向) で表す事が多いです。もちろん、rowが列というのが誤りであるという訳ではありませんが。
nskydiving

2019/04/12 12:13

まずはご自分でコードを書いてみて、分からない部分を質問してください。 全く分からないというのであれば、まだ Python の基礎が理解できていないということなので、学習サイトや入門書で学ばれると良いと思います。
kou0179

2019/04/12 12:17

追加質問失礼します。Pythonのバージョン指定はありますか?
namikko

2019/04/12 12:40

課題に書かれているのは以上の情報のみです。ご指摘がありましたところを修正いたしました。Pythonのバージョンは3.7.2を使用しております(macbook)。指定は最新のバージョンです。知識不足で申し訳ございません。只今絶賛コードを書いております。
kou0179

2019/04/12 12:43

英語があまり得意でないのでお聞きしたいのですが、行の指定は、「何行目か?」という指定で良いのでしょうか?
namikko

2019/04/12 12:50

kou0179 様 はい、おっしゃる通りです。例えば私が1000とインプットしたら1000行目+そこから100行をプリントできるようにコードを書きたいです。もし曖昧であれば申し訳ございません。。
guest

回答1

0

ベストアンサー

必要知識

  • 標準入出力
  • ファイルの開き方、読み込み方
  • 例外処理の仕方
  • Listの使い方
  • ファイルの書き込み方

注意点

正常な動作はテストしましたが、保証は致しかねます。
あくまでも以下に掲載するソースコードは解答例として参考にして頂き、
ご自身で、「何故こう動くのか」という事を意識した上で一行一行読んでいただけたら幸いです。

以下、ソースコード(解答例)

Python

1import sys 2 3# ファイル名を聞く 4print("Please enter a file name") 5file_name = input() 6 7try: 8 # ファイルを開けてみる 9 file = open(file_name, "r") 10except IOError: 11 # 開けれないならエラーを出力し、IO閉じて、エラーコードを返し終了 12 print(file_name+" is not found") 13 sys.exit(1) 14 15# 読み込んだファイルを一行ずつリストに入れる 16file_rows = file.readlines() 17# IOをクローズする 18file.close() 19 20# 何行目から読み込みたいか聞く 21# 読み込み直後にint型へ変換し、配列インデックスに合せ-1しとく 22print("What line does start row say that?") 23start_row = int(input())-1 24 25try: 26 # 指定された行にアクセスしてみる 27 _ = file_rows[start_row] 28except IndexError: 29 # アクセスできないならエラーを出力し、エラーコードを返し終了 30 print("The row is not found") 31 sys.exit(1) 32 33# 書き込み用にファイルを開く。本来であれば例外処理すべきだが指定が無いのであえてそのまま 34# 尚、"a"は追記モード 35new_file = open("count_"+file_name,"a") 36 37# 100回繰り返す、iには0、1、2、...98、99の順で値が入る 38for i in range(100): 39 try: 40 # 指定行の内容を変数にいれとく 41 current_row = file_rows[start_row + i] 42 except IndexError: 43 # もし100行満たす前に最後の行まで来てしまったら 44 # IOクローズして正常終了 45 new_file.close() 46 sys.exit(0) 47 48 # 現在行の内容をスペースで区切ってリスト化しその要素数を求める(=単語数を求める) 49 current_row_word_len = len(current_row.split()) 50 51 # 単語数を追加した、新しいファイルに書き込むための行を構築する 52 current_row = str(current_row_word_len) + " words | " + current_row 53 # ファイルに書き込む 54 new_file.write(current_row) 55 56#IOを閉じる 57new_file.close() 58#正常終了 59sys.exit(0)

仕様

  • ファイル名を標準入力で受け付け開きます。存在しない場合は終了します。
  • 何行目から読み込むか標準入力で受け付けます。存在しない行が指定された場合は終了します。
  • 指定された行から100行、単語数のカウント を行先頭に追記したファイルを「count_元ファイル名」で保存します。
  • 指定された行から、元ファイルの最後行が100行未満の場合は、最後行まで上述の処理を行います。

追加質問回答

追加質問①

一つ目は単語の数の表示なのですが、
I am a Japanese. (4)
このように表示するにはどうすればいいのでしょうか?

回答欄ソースコード、コメント,空行を除く、下から4行目あたりに

current_row = str(current_row_word_len) + " words | " + current_row

というコードがあるのは分かりますか?
この部分で、current_rowには最初、元のテキストのある一行がそのまま入ってますが、これに文字列結合でただ単語数を追加してるだけです!

まず、

python

1current_row = str(current_row_word_len) + " words | " + current_row

この行は、current_rowへ「何か」を代入する行というのはお分かりいただけると思います。

そして、その「何か」、すなわち、
str(current_row_word_len) + " words | " + current_row
は何をしているかというと、
次に以下3つを結合しています。

  • str(current_row_word_len) current_row_word_lenを文字列型へ変換したもの
  • words | 単純な文字列
  • current_row 文字列型変数(現在処理中の元ファイルの行の文字列)

それら結合した物を、current_rowへぶち込みなおす処理をしてます。

なので、I am a Japanese. (4)という表示にしたければ

python

1current_row = current_row + " (" + str(current_row_word_len) + ")"

で、いけそうですが、無理です。(私はこれでいけると思った・・・)
なぜならば、current_rowの一番最後の文字に改行コードが入ってしまっています。

よって、以下のようにcurrent_row最後の改行を消して、さらに改行コードを連結すればいけます。

python

1current_row = current_row.rstrip('\n') + " (" + str(current_row_word_len) + ")\n"

ポイントとしては

  • current_row.rstrip('\n')で改行コードを消してる
  • ")\n"で最後にカッコを閉じるだけでなく改行を入れてあげる

です。

追加質問②

二つ目は

python

1try: 2# 指定された行にアクセスしてみる 3_ = file_rows[start_row]

の初めの_の部分はどういうことを表しているのでしょうか?

これは特にPythonでは意味は無いです。紛らわしくてごめんなさい。
一部のプログラミング言語では、ブランク識別子等と呼ばれ、要は捨てるための変数と考えて頂けると分かりやすいです。
ただ、Pythonにはその概念が無いのでこのようにして使いました。
もっとスマートなやり方あれば教えてください笑

今回の場合、別に今すぐにはfile_rows[start_row]に対して用事は無いけど、
もし存在しなかったら困るから念のためtry:の中でいったんアクセスしてみる、ために使ってます。

投稿2019/04/12 13:11

編集2019/04/12 15:38
kou0179

総合スコア304

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

namikko

2019/04/12 14:00

kou0179様 本当にご丁寧にありがとうございます!!!! 度々申し訳ございませんが一つ問題がありまして、新しいファイルを開いても何も書き込まれいません。。。どうすればいいのでしょうか。。
kou0179

2019/04/12 14:06 編集

当方の環境では書き込まれているのですが、実行状況のスクリーンショット画像など掲載可能でしょうか。 まずは、以下手順で実行しているか確認してください。 ・コマンドでpyファイルを叩く ・標準入力よりファイル名を入力、エンター ・標準入力より読み込み開始行を入力、エンター
namikko

2019/04/12 15:07

kou0179様 無事に書き込まれました! 本当に申し訳ないのですがもう二つ質問があります。 一つ目は単語の数の表示なのですが、 I am a Japanese. (4) このように表示するにはどうすればいいのでしょうか? 二つ目は try: # 指定された行にアクセスしてみる _ = file_rows[start_row] の初めの_の部分はどういうことを表しているのでしょうか? 本当に度々申し訳ございません。 当方、海外在住で時差の関係があり、返事が遅れることがございます。 大変夜遅くに質問してご迷惑をおかけします。
kou0179

2019/04/12 15:35

追加質問、回答いたしました。分からなければ、またこちらのコメント欄へ。 最初丸投げかと思ってましたが理解しようとしてくれて嬉しいです!笑 お時間は週末なのでお気になさらず!
namikko

2019/04/12 15:43

本当に申し訳ないくらいご丁寧にコードも説明も書いていただきありがとうございました!!!! 画面の前で頭を下げました(笑) 大変お世話になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問