🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
ファイル

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

GitHub

GitHubは、Gitバージョン管理システムを利用したソフトウェア開発向けの共有ウェブサービスです。GitHub商用プランおよびオープンソースプロジェクト向けの無料アカウントを提供しています。

Python

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

Q&A

解決済

1回答

3093閲覧

UFFファイルの作成方法

tsuji__

総合スコア11

ファイル

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

GitHub

GitHubは、Gitバージョン管理システムを利用したソフトウェア開発向けの共有ウェブサービスです。GitHub商用プランおよびオープンソースプロジェクト向けの無料アカウントを提供しています。

Python

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

0グッド

0クリップ

投稿2021/03/18 08:17

編集2021/03/19 04:33

#質問
Pythonでcsv形式のデータファイルを読み込みuffファイルの作成を試みているのですが、実行時にエラーが発生し、原因があまり理解出来ておらず、修正方法が分からず困っています。また、今回用いたPythonコードはGit Hubのコードになります。Git Hub pyuff
#コード
申し訳ありませんが、コードをそのまま記載すると字数制限に引っかかってしまったので
リンクを貼らしていただきます。[uff.py]
(http://github.com/openmodal/pyuff/blob/master/pyuff.py)
コードの最初に次のように複素数データを格納するcsvファイルを作成しました。

Python

1def re(a,b): 2 c=a*math.cos(b*np.pi/180) 3 return c 4def im(x,y): 5 z=x*math.sin(y*np.pi/180) 6 return z 7v=[] 8Mypath='makeufftest_x.csv' 9with open(Mypath,encoding=("utf-8-sig")) as f: 10 reader=csv.reader(f, quoting=csv.QUOTE_NONNUMERIC) 11 print(reader) 12 print(type(reader)) 13 for row in csv.reader(f): 14 magnitude=(float(row[0])) 15 phase=(float(row[1])) 16 v.append(complex(re(magnitude,phase),im(magnitude,phase))) 17with open ('uffcomplex.uff','w') as f: 18 writer=csv.writer(f,lineterminator='\n') 19 writer.writerow(v)

そして最後に上記のcsvファイルを読み込ませるという方針で考えています。

Python

1if __name__ == '__main__': 2 # uff_ascii = UFF('uffcomplex.csv') 3 # a = uff_ascii.read_sets(0) 4 # print(a) 5 # prepare_test_55('./data/test_uff55.uff') 6 # uff_ascii = UFF('./data/Artemis export - Geometry RPBC_setup_05_14102016_105117.uff') 7 uff_ascii = UFF('uffcomplex.csv') 8 a = uff_ascii.read_sets(0) 9 #uff_ascii = UFF('./data/no_spacing2_UFF58_ascii.uff') 10 uff_ascii = UFF('uffcomplex.csv') 11 a = uff_ascii.read_sets(2) 12 for _ in a.keys(): 13 if _ != 'data': 14 print(_, ':', a[_]) 15 #print(sum(a['data']))

自分で変更したコードはこの部分で後は特に変更しておりません。
#入力ファイル(一部)

makeufftest_x.csv 0.487436891 0 0.653218389 134.6398315 0.193872914 166.9507599 0.202087417 123.1289139 0.583534479 154.6550446 0.128547326 56.14105988 0.12943536 -154.5452881 0.3214885 177.0462799 0.029101485 138.5561066 0.192596287 -175.8987427 ...
uffcomplex.csv (0.487436891+0j) (-0.4589825144147272+0.4647895385970837j) (-0.18886641385687497+0.04377424470730506j) (-0.11044575285292425+0.16923669751706533j) (-0.5273675102770167+0.2497919079674562j) (0.07162016248094702+0.1067472123661926j) (-0.11687045992794481-0.05563099868382958j) (-0.32106139694892377+0.01656608044938813j) (-0.02181459622312576+0.019261874800424086j) (-0.19210308907627732-0.013774357826709462j) ...

この複素数データが801個あります。
#現状

Python

1Traceback (most recent call last): 2 3 File "C:path\pyuff.py", line 474, in _read_set 4 si = self._blockInd[n][0] # start offset 5 6IndexError: list index out of range 7 8 9During handling of the above exception, another exception occurred: 10 11Traceback (most recent call last): 12 13 File "C:path\pyuff.py", line 391, in read_sets 14 dset.append(self._read_set(ii)) 15 16 File "C:path\pyuff.py", line 483, in _read_set 17 raise UFFException('Error reading data-set #: ' + int(n)) 18 19TypeError: can only concatenate str (not "int") to str 20 21 22During handling of the above exception, another exception occurred: 23 24Traceback (most recent call last): 25 26 File "C:path\pyuff.py", line 1654, in <module> 27 a = uff_ascii.read_sets(0) 28 raise UFFException('Error when reading data-set(s)') 29 30UFFException: Error when reading data-set(s)

最後のif name == 'main':
の部分にcsvファイルを読み込ませるときにエラーが出てしまいます。
#試したこと
デバッグモードを用いて def read_sets内でエラーが発生していることを突き止めたが、対処方法が分からない。(例外処理?を行っているらしいが...)
Git Hub上の質問などを調べたが解決には至らず。
要求バージョンなどを確認
#要求バージョン

Python

1numpy>=1.12.0 2pytest>=3.0.5

#完成のイメージ

unvファイル

1 -1 2 18 3 1 0 0 1 1 4CS1 5 0.00000E+00 0.00000E+00 0.00000E+00 1.00000E+00 0.00000E+00 0.00000E+00 6 0.00000E+00 0.00000E+00 1.00000E+00 7 -1 8 -1 9 15 10 7 1 0 1 -5.16190E+01 5.16190E+01 5.00000E+01 11 6 1 0 1 -3.65000E+01 6.32200E+01 5.00000E+01 12 5 1 0 1 -1.88940E+01 7.05130E+01 5.00000E+01 13 4 1 0 1 5.09760E-15 8.32500E+01 5.00000E+01 14 3 1 0 1 1.88940E+01 7.05130E+01 5.00000E+01 15 2 1 0 1 3.65000E+01 6.32200E+01 5.00000E+01 16 1 1 0 1 5.16190E+01 5.16190E+01 5.00000E+01 17 24 1 0 1 6.32200E+01 3.65000E+01 5.00000E+01 18 23 1 0 1 7.05130E+01 1.88940E+01 5.00000E+01 19...

これはGit Hub上からお借りしているので、実際得られる値は違うものになりますが、見た目はこのような感じになると思っています。uffファイルイメージ
長いコードで申し訳ありませんが、誰かお力添えして頂ければ幸いです。
どうかよろしくお願いします。

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

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

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

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

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

etherbeg

2021/03/18 15:07

raise UFFException('Error when reading data-set(s)') はエラー出力の一部ですか? エラー出力は省略せずに全文を正確に貼ってください。ユーザ名などで見られたくないものがあればそれは置き換えてもらってもいいです。また見やすいようにコードブロックの中に貼ってください。 「この複素数データが801個あります」とのコメントがある入力ファイルは、csvファイルには見えないので、'uffcomplex.uff' ですか? 'makeufftest_x.csv' の中身も知りたいので、一部でいいので、これもコードブロックを使って、貼ってもらいたいです。
etherbeg

2021/03/19 04:27 編集

エラーメッセージとデータの追記ありがとうございます。 「最初に次のように複素数データを格納するcsvファイルを作成」のコードの中の「v.append(complex(re(magnitude,phase),im(magnitude,phase)))」の部分の re() と im() はどこから出てきたものでしょうか? どこかコードの別の部分で定義されている関数とかでしょうか?
tsuji__

2021/03/19 04:41

はい、コード中の別の部分で定義した関数になります。 re()はmakeufftest_xの1列目を振幅、2列目を位相と見なし、この2つのデータから複素数の実部を作成し、同様にim()は同じデータから複素数の虚部を作成する関数になります。 それらから得たデータをcomplexを用いて複素数を生成しています。
guest

回答1

0

ベストアンサー

CSV 形式のデータファイルを読み込み UFF ファイルを作成したいということで、書かれたコードが uff_ascii = UFF('uffcomplex.csv’) ですが、このコードでは UFF ファイルの作成はできないようです。

pyuff の GitHub リポジトリに、pyuff_Showcase.ipynb という名前の、簡単なコードサンプルのファイルがあります。この中の “Write measurement data to UFF file” という見出しのブロックにあるコードが、手持ちのデータから UFF ファイルを作成するコード例です。
https://github.com/openmodal/pyuff/blob/master/pyuff_Showcase.ipynb

このコードで行われているのは、以下のようなことです。

① 手持ちのデータを、データセットごとに決められているキーを使って、Python の辞書の形にまとめる
② UFF クラスに UFF ファイルのパスを渡して、UFF クラスのインスタンスをつくる(uffwrite = pyuff.UFF('./data/measurement.uff’) の部分)
③ write_sets メソッドに①で作った辞書を渡して、UFF ファイルに書き出す(uffwrite._write_set(data,'add’) の部分。なぜか _write_set を使っていますが、ここは write_sets を使って uffwrite.write_sets(data) でいいはず)
④ 複数のデータセットがあるときは、①〜③を同一の UFF ファイルパスに対して繰り返し行い、ファイルに追記する

write_sets() の実行後は、UFF クラスのインスタンス(ここでは uffwrite)に対して uffwrite.read_sets(0) などの操作が可能になります。

①の「データセットによって決められたキー」に関しては、Python インタプリタを起動して、pyuff ライブラリのヘルプを参照することによって、確認することができます。

sh

1$ python3 2Python 3.9.2 (v3.9.2:1a79785e3e, Feb 19 2021, 09:06:10) 3[Clang 6.0 (clang-600.0.57)] on darwin 4Type "help", "copyright", "credits" or "license" for more information. 5>>> import pyuff 6>>> help(pyuff) # pyuffライブラリ全体のヘルプ 7>>> help(pyuff.UFF) # UFF クラスのヘルプ 8>>> help(pyuff.UFF.write_sets) # write_sets メソッドのヘルプ 9(...etc)

現在サポートされているデータセットの種類は 151, 15, 55, 58, 58b, 82, 164, 2411, 2412, 2420 だそうです。必須のキーとオプションのキーがあるようです。また、配列データには np.array を使用する必要があるようです。

sh

1>>> help(pyuff.UFF) 2 3Help on class UFF in module pyuff: 4 5class UFF(builtins.object) 6 | UFF(fileName) 7 | 8 | Manages data reading and writing from/to the UFF file. 9 | 10(...) 11 | 12 | All array-type data are read/written using numpy's ``np.array`` module. 13 | 14 | Appendix 15 | -------- 16 | Below are the fileds for all the data sets supported. <..> designates an 17 | *optional* field, i.e., a field that is not needed when writting to a file 18 | as the field has a defualt value. Additionally, <<..>> designates fields that 19 | are *ignored* when writing (not needed at all); these fields are defined 20 | automatically. 21 | 22 | Moreover, there are also some fields that are data-type dependent, i.e., 23 | some fields that are onyl used/available for some specific data-type. E.g., 24 | see ``modal_damp_vis`` at Data-set 55. 25 | 26 | **Data-set 15 (points data)**: 27 | 28 | * ``'type'`` -- *type number = 15* 29 | * ``'node_nums'`` -- *list of n node numbers* 30 | * ``'x'`` -- *x-coordinates of the n nodes* 31 | * ``'y'`` -- *y-coordinates of the n nodes* 32 | * ``'z'`` -- *z-coordinates of the n nodes* 33 | * ``<'def_cs'>`` -- *n deformation cs numbers* 34 | * ``<'disp_cs'>`` -- *n displacement cs numbers* 35 | * ``<'color'>`` -- *n color numbers* 36 | 37(...)

ヘルプの文章自体は、ライブラリのソースコード (pyuff.py) の中に書き込まれていますので、ソースコードを直接参照することもできます(モジュールの先頭、各クラス・関数定義の先頭にコメントの形で書き込まれています)。

pyuff.prepare_test_15() などのテスト関数も用意されているようですので、それでデータセットごとに用意すべき辞書の形式を確認することもできるようです(Showcase の “Test functions” のブロックを参照してください)。

python

1>>> pyuff.prepare_test_15() 2{'type': 15, 'node_nums': [16, 17, 18, 19, 20], 'def_cs': [11, 11, 11, 12, 12], 'disp_cs': [16, 16, 17, 18, 19], 'color': [1, 3, 4, 5, 6], 'x': [0.0, 1.53, 0.0, 1.53, 0.0], 'y': [0.0, 0.0, 3.84, 3.84, 0.0], 'z': [0.0, 0.0, 0.0, 0.0, 1.83]}

以上を参考に、ヘルプや Showcase のコードに当たってから、もう一度コードを作成してみて、どうしてもうまくいかなければまたお尋ねいただければと思います。

なお、質問に書かれていたコードで気になった箇所を以下に列挙しますので、こちらも参考にしていただければと思います。


pyuff ライブラリのモジュールである pyuff.py に直接ご自分のコードを書き込まれているようですが、何か理由がありますか?
ライブラリを使用するときは通常、インポートして使います。特に理由がなければ、ご自分のコードを書かれるファイルと、ライブラリは分けておくことをお勧めします。
例えば my_script.py というファイルに自分のコードを作成していくとして、そのファイルの先頭で次のようにライブラリをインポートして使います。

python

1import math 2 3import numpy as np 4import pyuff 5 6uff_file = pyuff.UFF('data/beam.uff') 7(...)

「入力ファイル(一部)」に記載されている makeufftest_x.csv ファイルの形式が CSV ではありませんが、本当にこのファイルから問題なく読み込めていますか? CSV ではなく TSV のように見えますが。uffcomplex.csv も CSV ではないようです。ここに転記する際に、見やすいように変更しただけならいいのですが…(ただこのように質問においてプログラムの一部として使用したファイルの場合は、ファイル通りに転記してもらうのが望ましい)。

複素数の実部を作成するために定義された re() 関数は、名前を変えたほうがいいです。Python の標準ライブラリに、正規表現を扱うための re というライブラリがあり、re() という関数を定義するとこの re ライブラリを上書きしてしまうために、コード中で正規表現が使えなくなるからです。
現在は正規表現を使ってなかったとしても、後々にコードを発展させていった際に、原因のわからないトラブルとなりかねません。これきりの使い捨てのコードならこのままでもいいですが…。

python

1with open(Mypath,encoding=("utf-8-sig")) as f:

python

1with open(Mypath, encoding="utf-8-sig") as f:

でいいです。"utf-8-sig” を囲むカッコは要りません。
同様に、

python

1magnitude=(float(row[0]))

magnitude = float(row[0])

でいいです。

python

1phase=(float(row[1]))

python

1phase = float(row[1])

でいいです。

下記の箇所で

Python

1with open(Mypath,encoding=("utf-8-sig")) as f: 2 reader=csv.reader(f, quoting=csv.QUOTE_NONNUMERIC) 3 print(reader) 4 print(type(reader)) 5 for row in csv.reader(f): 6(...)

csv.readerオブジェクトの作成が2回行われています。先に作成されたオブジェクトは、作成されただけで使われていません。下記のいずれかの書き方に訂正してください。

python

1with open(Mypath, encoding="utf-8-sig") as f: 2 reader = csv.reader(f, quoting=csv.QUOTE_NONNUMERIC) 3 for row in reader: 4(...) 5 6# もしくは 7with open(Mypath, encoding="utf-8-sig") as f: 8 for row in csv.reader(f, quoting=csv.QUOTE_NONNUMERIC): 9(...)

csv.reader オブジェクトに csv.QUOTE_NONNUMERIC を渡す場合は、float 型に変換するためのコード(magnitude = float(row[0]) と phase = float(row[1]))は不要です。csv.QUOTE_NONNUMERIC は、クォートされていないすべてのフィールドを float 型に変換するよう指示するからです。csv.QUOTE_NONNUMERIC を渡さない場合は必要です。以下のいずれかに修正してください。

python

1with open(Mypath, encoding="utf-8-sig") as f: 2 reader = csv.reader(f, quoting=csv.QUOTE_NONNUMERIC) 3 for row in reader: 4 magnitude = row[0] 5 phase = row[1] 6(...) 7 8# もしくは 9with open(Mypath, encoding="utf-8-sig") as f: 10 reader = csv.reader(f) 11 for row in reader: 12 magnitude = float(row[0]) 13 phase = float(row[1]) 14(...)

投稿2021/03/20 23:59

編集2021/03/21 00:12
etherbeg

総合スコア1195

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

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

tsuji__

2021/03/23 04:10

ご回答及びアドバイス等誠にありがとうございました。 提示されたGitHubのサンプルを参考にしつつ、自分の任意のcsvファイルを導入することでuffファイルへの変換が確認出来ました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問