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

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

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

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

Q&A

解決済

2回答

7975閲覧

invalid literal for int() with base 10: '-'

yep

総合スコア45

Python 3.x

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

0グッド

1クリップ

投稿2018/12/28 13:11

編集2018/12/28 13:31

#やりたいこと
数値のプラスとマイナスを判定しテキストにアウトプットしたいと考えています。

-62, -32, 22, 52, -42

完成形

00110

#試したこと

with open('array.txt') as file: filedata = file.read() filedata = filedata.replace('e-0', '') filedata = filedata.replace(' ', ', ') with open(r'array.txt', 'w', encoding='utf-8') as file: file.write(filedata) with open('array.txt') as file: number = file.read() int_list = map(int, number) num_list = list(int_list) output = [] for value in num_list: if value > 0: output.append('1') else: output.append('0') with open(r'number.txt', 'w', encoding='utf-8') as file: file.write(output)
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-57-11d5f6dcd74f> in <module> 20 number = file.read() 21 int_list = map(int, number) ---> 22 num_list = list(int_list) 23 24 output = [] ValueError: invalid literal for int() with base 10: '-'

#環境
python 3.6.7
numpy 1.15.4
ubuntu 18.04

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

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

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

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

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

can110

2018/12/28 19:23

array.txtは複数行ありますか(エラー見る限り複数行のようですが)? また一方、number.txtは単一行で出力したいということでいいですか?
yep

2018/12/29 02:03 編集

array.txtは、複数行あります。number.txtは、単一行でもかまいません。
can110

2018/12/29 02:20

了解しました。回答のコードでいけるかと思います。
guest

回答2

0

ベストアンサー

複数行のCSVファイルを全行読み取ったデータから、所望のデータを作成するコード例です。
できるだけ単純な処理を段階的に適用するように記述しています。
このように記載することで、意図しない動作をした場合に、その場所を特定しやすくなります。

なおLouiS0616さんも指摘されていますが、列数が固定ならCSVモジュールを使って、なおかつ全行一括ではなく行毎に処理するほうが柔軟性も高く自然です。

Python

1# 略 2#number = file.read() 3number = '-1, 2\n 3,-4\n' # 2行のCSV。末尾にも改行あり 4 5import re 6lst = re.split( '[,\n]',number) # 文字列をカンマまたは改行で区切ってリストに 7print(lst) # ['-1', ' 2', ' 3', '-4', ''] 末尾の改行分も別要素として切り出されるが後で無視する 8 9output = '' 10for s in lst: 11 s = s.strip() # 前後の空白は除去 ' 3'→'3' 12 if len(s) <= 0:# (改行のみなどで生成された)空要素は処理しない 13 continue 14 15 n = int(s) #文字列'-1'を数値-1に 16 if n > 0: 17 output += '1' 18 else: 19 output += '0' 20 21print(output) # 0110 22# 略 23# file.write(output)

ついでに

全行読み取ったデータから行毎に処理するコードを記載してみました。
行毎に読み込み、変換、書き込みするほうが以下よりも簡潔に記載できます。

Python

1# 略 2#number = file.read() 3number = '-1, 2\n 3,-4\n' # 2行のCSV。末尾にも改行あり 4 5lines = number.split('\n') # 文字列を改行で区切って行リストに 6 7# 行毎に処理 8for line in lines: 9 # 改行のみの空行はとばす 10 line = line.strip() 11 if len(line) <= 0: 12 continue 13 14 # カンマで区切られた数字毎に処理 15 output = '' 16 lst = line.split(',') 17 for s in lst: 18 s = s.strip() # 前後の空白は除去 ' 3'→'3' 19 if len(s) <= 0:# (改行のみなどで生成された)空要素は処理しない 20 continue 21 22 n = int(s) #文字列'-1'を数値-1に 23 if n > 0: 24 output += '1' 25 else: 26 output += '0' 27 28 print(output) # '01' や '10' 29 # file.write(output+'\n')

投稿2018/12/28 19:47

編集2018/12/29 02:25
can110

総合スコア38233

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

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

yep

2018/12/29 03:13 編集

file.wite(output+'\n')で、複数行もできるようにして頂けたということでしょうか?ありがとうございます。
guest

0

Python

with open('array.txt') as file:
number = file.read()

試しに print(type(number), number) とでもすれば分かりますが、これは文字列です。
数値にパースする前に適切に分割してリストにしてやらないといけません。

例えばこんなふうに。

Python

1number = number.split(', ')

投稿2018/12/28 13:20

LouiS0616

総合スコア35658

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

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

yep

2018/12/28 13:25 編集

実は、それは試しましたが以下のようなエラーが出ました。ValueError: invalid literal for int() with base 10: '-72\n32'
LouiS0616

2018/12/28 13:31

複数行にわたるcsvファイルならばcsvモジュールを使って読み取っては?
yep

2018/12/28 13:33

csvファイルではなくテキストデータなのですが、csvの方が扱いやすいでしょうか?
LouiS0616

2018/12/28 14:29

列数が同じならcsvファイルとして扱って良いかと。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問