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

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

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

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

Python

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

Q&A

解決済

2回答

4917閲覧

Python Excelからテキストファイルへの転記について

SuzuAya

総合スコア71

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2021/03/15 09:16

編集2021/03/15 11:59

前提・実現したいこと

ExcelのA列の値を1つずつ取り出してテキストファイルのタイトルに入力し、保存したいと考えています。
今のコードですとテキストファイルのタイトルが('A列の値',).txtとなってしまいます。
この()と'',を削除するにはどうしたらいいでしょうか。

該当のソースコード

Python

1#! python3 2# -*- coding: utf-8 -*- 3 4# excel2txt.py 5# 概要: 6# 引数に指定したexcelファイルを読み込んで、新規ディレクトリにtxtファイルを作成していきます。 7# 指定されたexcelファイルのアクティブシートが対象となります。 8# txtファイルは、A列、B列...の順に作成されていきます。 9# ディレクトリはこのスクリプトを実行した場所に作られます。 10# ディレクトリ名は、「excel2txt_ワークシート名」になります。 11# excelファイルの拡張子は.xlsxのみ対応します。 12# 使い方: 13# excel2txt.pyを実行してください。 14# 引数にはexcelファイル名を入力してください。 15# 実行例: 16# $ ls 17# excel2txt.py example.xlsx 18# $ python excel2txt.py example.xlsx 19 20import sys 21import os 22import openpyxl 23 24# コマンドライン引数の取得する 25if not len(sys.argv) == 2: 26 print('Usage: python excel2txt.py file_name.xlsx') 27 print(' One argument must required.') 28 print('example: python excel2txt.py example.xlsx') 29 sys.exit() 30# ファイルパスを変数に格納する 31file_path = sys.argv[1] 32 33# ファイルの存在を確認する。 34if not os.path.isfile(file_path): 35 print(file_path) 36 print(file_path + ' is not exist.') 37 sys.exit() 38# excelファイルとみなす拡張子を設定する 39ext = 'xlsx' 40# ファイル名の拡張子を確認してxlsxだったら処理を開始する。 41if ext in file_path.rsplit('.')[-1]: 42 43 # excelファイルを読み込んでシートのタイトルを取得し、シートの存在を確認する 44 try: 45 wb = openpyxl.load_workbook(file_path) 46 ws = wb.active 47 ws_title = ws.title 48 except AttributeError: 49 print('Sheet dose not exist in "' + file_path + '".') 50 sys.exit() 51 52 # ディレクトリを新規作成する 53 dir_name = 'excel2txt_' + ws_title 54 try: 55 os.mkdir(dir_name) 56 except FileExistsError: 57 print('Directory of ' + dir_name + ' exists.') 58 sys.exit() 59 # ディレクトリを移動する 60 os.chdir(dir_name) 61 62 # A列の値を1つずつテキストファイルのタイトルに入力し保存 63 for cell_value in ws.iter_rows(max_col=1, values_only=True): 64 file_name = str(cell_value) + '.txt' 65 file = open(file_name, mode='w', encoding='utf-8') 66 file.close() 67 68else: 69 print(file_path + ' is not excel file.') 70 sys.exit()

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

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

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

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

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

guest

回答2

0

python

1 # シートを列ごとに取得してファイル作成のループ 2 for col in range(ws.max_col): 3 file_name = ws_title + '_' + str(col) + '.txt' 4 file = open(file_name, mode='w', encoding='utf-8') 5 for cell in list(ws.cols)[col]: 6 file.write(str(cell.value) + '\n') 7 file.close()

上記の部分ですが、A列であれば、ws.iter_rows(max_col=1, values_only=True)でループを回し、その値でファイル名を生成すれば良いかと。

python

1for cell_value in ws.iter_rows(max_col=1, values_only=True): 2 file_name = str(cell_value) + '.txt' 3 file = open(file_name, mode='w', encoding='utf-8') 4 file.close()

動作確認はしていません。

投稿2021/03/15 09:40

t_obara

総合スコア5488

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

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

SuzuAya

2021/03/15 11:16

>t_obara様 ご回答ありがとうございます! ほぼやりたいことが実現できたのですが、ファイル名に('A列の値',).txtというように()と''がついてしまいます。こちらはどう修正すれば消えるでしょうか。
SuzuAya

2021/03/16 03:49

ありがとうございます。無知で恥ずかしい限りですが、値の取得がよく分かりませんでした…。もう少し調べてみます。
guest

0

自己解決

pandasを使った方が早そうだったので、コードを丸ごと書き換えたところ、うまくいきました。

Python

1import pandas as pd 2import numpy as np 3import os 4 5def make_traincsv_yolov5(path): 6 #train.csvの内容を読み込み、pandasのDataFrameに格納 7 df = pd.read_csv(path) 8 9 #重複を排除したリストの作成 10 image_id_unique = df.image_id.unique() #重複したimage_idを排除したimage_idリスト作成 11 rad_id_unique = df.rad_id.unique() #重複したrad_idを排除したrad_idリスト作成 12 13 #dfに新たな列'sum'を加え、BBoxの情報を格納する 14 df.fillna(9999, inplace=True) #まずnullを9999に変えておく(nullのままだと次の行を実行できないため) 15 df['sum'] = df.class_id.astype(str) + ' ' + df.x_min.astype(int).astype(str) + ' ' + df.y_min.astype(int).astype(str) + ' ' + df.x_max.astype(int).astype(str) + ' ' + df.y_max.astype(int).astype(str) 16 df.loc[df.class_id==14, 'sum'] = '14 0 0 1 1' #疾患の無い画像の'sum'は、左記のように指定する 17 18 #txtファイルの出力先フォルダを作成 19 output_dir = './yolov5_txt' 20 os.makedirs(output_dir, exist_ok=True) 21 22 #rad_idごとのアノテーション結果をまとめたtxtファイルを作る 23 for image in image_id_unique: #for image in image_id_unique[4:5]: 24 df2 = df.loc[df.image_id==image] 25 for rad in df2.rad_id.unique(): 26 #新たな画像ファイル名を(元の画像ファイル名)_(rad_id).pngとする 27 txt_fname = image + '_' + rad + '.txt' #←新たな画像に対するtxtファイルの名前 28 df2.loc[df2.rad_id==rad, 'sum'].to_csv(f'{output_dir}/{txt_fname}', index=None,header=None,sep=",") #←新たな画像に対するtxtファイルを出力 29 30make_traincsv_yolov5("./train.csv/train.csv")

投稿2021/03/16 06:06

SuzuAya

総合スコア71

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問