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

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

新規登録して質問してみよう
ただいま回答率
85.35%
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Python

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

Q&A

1回答

853閲覧

リストに含まれる日付表現のみを抽出し、ファイルに出力したい。

SAkana77777

総合スコア1

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Python

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

0グッド

0クリップ

投稿2021/12/03 08:24

編集2021/12/03 14:52

やりたいことは以下の通りです。(下に追記あり)
ファイル(sample-re.txt)から文字列を1行ずつ読み込み、リストに格納する。
リストに含まれる日付表現のみを抽出し、それをファイル(New_sample-number.txt)に出力する。

ファイルは読み込み、リストに格納することができましたが、日付表現を抽出し、ファイル出力ができていません。ファイルの出力自体は可能ですが、何も書かれていないファイルになってしまいます。改善点はどこでしょうか?エラーコードは何も出ていません。

import re f = open("sample-re.txt","r") a = list(f) f.close() pattern = r'(明治|大正|昭和|平成|令和)\d{1,2}年(0?[1-9]|1[0-2])月(0?[1-9]|[12][0-9]|3[01])日' print(a) for b in a: print(b.strip()) uploaded = files.upload() for fn in uploaded.keys(): print('アップロードファイル名 : "(name)" サイズ : {length} bytes' .format(name=fn, length=len(uploaded[fn]))) with open(fn, "r") as F: data = F.readlines() newFn = "New_" + fn with open(newFn, "w") as newF: files.download(newFn)

自分なりに色々と試行錯誤した結果以下のようにはなりました。

import re from google. colab import files with open("sample-re.txt",'r') as F: lines = F.readlines() i = 0 sentence =[] for l in lines: l = l.rstrip() m = re.search('¥d{4}年¥d{1,2}月¥d{1,2}日|¥d{1,2}月¥d{1,2}日|¥d{1,2}日' , l) if m: i+=1 sentence.append(m.group(0)) with open("New_sample-number.txt","w") as f: f.write(str(data)) print(i, m.group(0)) files.download("New_sample-number.txt")

しかし、以下のようなエラーが出てしまいます。

FileNotFoundError Traceback (most recent call last)

<ipython-input-6-4332fd26b0a3> in <module>()
17 print(i, m.group(0))
18
---> 19 files.download("New_sample-number.txt")
/usr/local/lib/python3.7/dist-packages/google/colab/files.py in download(filename)
141 raise OSError(msg)
142 else:
--> 143 raise FileNotFoundError(msg) # pylint: disable=undefined-variable
144
145 comm_manager = _IPython.get_ipython().kernel.comm_manager
FileNotFoundError: Cannot find file: New_sample-number.txt

何をどうすれば解決に至るのかがわかりません。どうかご教授願います。

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

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

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

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

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

itagagaki

2021/12/03 09:11

files.upload()やfiles.download()はGoiogle Colabですか? それを利用している意図を教えてください。 あと肝心なのはpatternは定義されているが使用されていないことです。なぜですか?
SAkana77777

2021/12/03 12:23

はいGoogle Colabを使用しています。以前もファイル出力をしたことがあり、その時のプログラムを利用したという感じです。 patternに関しては、どのようにすれば使用できるのか、あまり理解できていません。
guest

回答1

0

まずファイル入出力に問題があるように思います。

newfnが出力ファイル名のようですが、それを書き込みモードでopenしたまでは良いものの、そのファイルに対するデータの書き込み(writeまたはwriteline)が行われていませんね。

ファイルの読み書きについては python open read write で情報を探すなどして学んでください。

たとえば:

Pythonでファイルの読み込み、書き込み(作成・追記) | note.nkmk.me

で、これは「ローカル」のファイルを操作するものですが、Colabでの「ローカル」はちょっと難解で、uploaddownloadといった工夫が必要になります。これについては理解されているようですが、一応解説ページを貼っておきます。

【Tips】Google Colaboratory でPythonのファイル入出力演習 - Qiita

そして、やりたいことはdataからpatternにマッチする部分を抽出した結果をローカルファイルに対してwriteまたはwritelineすることだと思います。

文字列から正規表現にマッチする部分をすべて取り出すにはfindallを使います。
以下のページのfindallを使ったサンプルコードを見て学んでください。

ゼロから覚えるPython正規表現の基本とTips - Qiita

投稿2021/12/03 12:49

itagagaki

総合スコア8402

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問