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

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

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

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

Q&A

解決済

1回答

2919閲覧

python テキストファイルから読み取り 日数計算

u_k_statistics

総合スコア44

Python

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

0グッド

1クリップ

投稿2015/06/26 07:08

pythonで
![イメージ説明]WIDTH:600というファイルを読み込んで、以下のようにしてデータをitemsに取り込んでいます。

with open("xxx.txt", "r") as g:
#textを分割
whole_str = g.read()
items = re.split(r'\t|\n', whole_str)

#!/usr/bin/env python

-- coding: utf-8 --

そして、10/31(日付の最後を知りたい)が何番目なのかを調べるために
for i in range(6, 69):
if items[i].isdigit():
day2 = items[i - 1]
x = i - 1
break

のようにして調べています。
その後、09/01が入っているitems[5]とday2の差を取るために
d = (dt.strptime(items[x], '%m/%d') - dt.strptime(items[5], '%m/%d')).days
print d

としているのですが、
Traceback (most recent call last):
File "xxx.py", line 24, in <module>
d = (dt.strptime(items[65], '%m/%d') - dt.strptime(items[5], '%m/%d')).days
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/_strptime.py", line 328, in _strptime
data_string[found.end():])
ValueError: unconverted data remains:

のようにでてしまいます。
ですが
d = (dt.strptime(items[x - 1], '%m/%d') - dt.strptime(items[5], '%m/%d')).days
print d

とするとちゃんと
59
が返ってきます。

どなたか解決していただける方、回答宜しくお願いします。

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

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

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

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

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

ryunix

2015/06/26 11:58

タブ文字で分割などを行っているため、正確なデータが必要です!(画像では分かりづらい) 入力データのテキスト版を追記願います :)
u_k_statistics

2015/06/27 09:30 編集

ryunixさん 回答ありがとうございます。 テキストのデータは以下のようになっています。 また実際のデータは申し訳ありませんがお見せすることはできないため、数値やプランの欄を書き換えた形で提供させていただきました。 宜しくお願いします。
u_k_statistics

2015/06/27 09:31 編集

plancode soeji getday planname people 09/01 09/02 09/03 09/04 09/05 09/06 09/07 09/08 09/09 09/10 09/11 09/12 09/13 09/14 09/15 09/16 09/17 09/18 09/19 09/20 09/21 09/22 09/23 09/24 09/25 09/26 09/27 09/28 09/29 09/30 10/01 10/02 10/03 10/04 10/05 10/06 10/07 10/08 10/09 10/10 10/11 10/12 10/13 10/14 10/15 10/16 10/17 10/18 10/19 10/20 10/21 10/22 10/23 10/24 10/25 10/26 10/27 10/28 10/29 10/30 10/31 0000000 aaaaaa 20150101 プランA 1 27324 27324 27324 27324 0 0 27324 27324 0 0 0 0 0 0 27324 27324 27324 27324 0 0 0 0 27324 27324 0 0 0 0 27324 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0000001 aaaa 20150101 プランB 2 24948 24948 24948 24948 0 0 24948 24948 24948 0 24948 0 0 0 24948 24948 0 0 0 0 0 0 24948 24948 24948 0 0 0 24948 24948 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
u_k_statistics

2015/06/27 09:34

本来は10/31と0000000の間は改行で区切られているようになっているのですが、コピペしたところ上のようなデータになっていまいました。 何かと拙くて申し訳ありません。。。
guest

回答1

0

ベストアンサー

情報追加、ありがとうございます :D

いただいたデータを使用し、10/31の後に改行を入れました。
実行してみたのですが、エラーにはなりませんでした :o
何か違いがあるか確認していただけないでしょうか?(やはりデータが怪しいのかな?)

lang

1import re 2with open("xxx.txt", "r") as g: 3 whole_str = g.read() 4 items = re.split(r'\t|\n', whole_str) 5 6for i in range(6, 69): 7 if items[i].isdigit(): 8 day2 = items[i - 1] 9 x = i - 1 10 break 11 12print day2 # -> '10/31' 13print x # -> 64 14 15 16from datetime import datetime as dt 17d = (dt.strptime(items[x], '%m/%d') - dt.strptime(items[5], '%m/%d')).days 18print d # -> 60 19d = (dt.strptime(items[x - 1], '%m/%d') - dt.strptime(items[5], '%m/%d')).days 20print d # -> 59

投稿2015/06/27 10:40

ryunix

総合スコア1656

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

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

u_k_statistics

2015/06/28 10:06

ryunixさんと同じように行いましたがエラーが出てしまいました。。。 やはりデータがおかしいのだと思うので提供元に聞いてみようと思います。 プログラミングが間違っていなかったとわかりよかったです!! ありがとうございました。
ryunix

2015/06/28 13:06

うーむ、あまり力になれず申し訳ないです... また何かありましたら言ってください :)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問