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

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

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

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python

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

Inkscape

Inkscape(インクスケープ)はオリジナル画像やオリジナルロゴの作成、写真の加工が出来るソフトです

Q&A

解決済

1回答

6873閲覧

.svgファイルを.emfファイルに変換変換する(Python3)

Danrussia

総合スコア44

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python

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

Inkscape

Inkscape(インクスケープ)はオリジナル画像やオリジナルロゴの作成、写真の加工が出来るソフトです

0グッド

0クリップ

投稿2020/01/29 02:28

編集2020/01/29 03:55

前提・実現したいこと

Python3系を利用して、".svg"ファイルを".emf"ファイルに変換したいと考えています。

下記のサイトを参考にした際、matplotlibを使用して「グラフを描画 → 描画したファイルを保存 → emfファイルに変換」
という工程はできました。
(参考にしたサイト: https://qiita.com/gitytm15/items/418ddcd8f58555d7433b
http://yshampei.hatenablog.com/entry/2017/11/18/163504
https://teratail.com/questions/236513)

しかし、ある特定のフォルダーにある複数の.svgファイルを.emfファイルに変換する事ができません。

特定のフォルダ内にあるsvgファイル

該当のソースコード(訂正 2020/01/29/12:55/)

import subprocess import os path = "C://Users//For Programming//Documents//Python Scripts//ImageJ_GrayValue//figure" lis = os.listdir(path) for i in lis: name = (i[0:(len(i)-4)]) #svgを抜いた奴 print(name) subprocess.call('"C://Users//For Programming//Documents//Python Scripts//Inkscape//inkscape.exe " + name + ".svg" + "-M" + name + ".emf" ',shell=True) subprocess.call('inkscape + name + ".svg" + "-M" + name + ".emf" ',shell=True)

試したこと

実装手順としては次の様に考えました。「os.listdir(path) でファイル名をリストで習得する」↓
「for文にファイル名のリストを渡して、拡張子を抜いたファイル名を習得する。」↓
「subrocess.call()でsvgファイルをemfファイルに変換する」

最初は文法エラーだと思ったのですが、実際に実行したときには特に何のエラーも発生しなく、実装できない障害が思い当たりません。

補足情報(FW/ツールのバージョンなど)

Windows10
Anaconda
Python3
Jupyter Notebook
Inkscape

直接的な解決案の回答でなくとも、参考になりそうなサイト、類似の事例を教えて頂けると幸いです。
お忙しいとは思いますが、よろしくお願いいたします。
情報に不足がありましたら、ご指摘お願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

~inkscape.exe" + name + ".svg" + "-M" + name + ".emf" ~だとnamehogeだった場合
~inkscape.exehoge.svg-Mhoge.emf~のように文字列がひっついてしまいます。
~inkscape.exe " + name + ".svg " + " -M " + name + ".emf" ~のようにスペース文字を入れてみてください。

さらに

  • inkscapeや画像のファイルパスにスペースが含まれていても大丈夫なように、パス名はダブルクオーテーションで囲みます。
  • Pythonの実行ディレクトリと画像のあるディレクトリが異なっていてもよいように、画像はフルパスで渡します。
  • コマンド文字列全体をcmd変数として作成し、printで表示することで設定ミスなどがないか確認しやすくなります。

上記をふまえると以下のようなコードでよいかと思います。各パス名はご自身の環境に合わせてください。

Python

1import subprocess 2import os 3 4ink_path = 'C:/Program Files/Inkscape/inkscape.exe' 5path = 'C:/users/user/desktop/img dir' # スペースを含むディレクトリ名 6 7lis = os.listdir(path) 8for i in lis: 9 name = os.path.splitext(os.path.basename(i))[0] # 拡張子を取り除く 10 cmd = '"{}" "{}/{}.svg" -M "{}/{}.emf"'.format(ink_path, path, name, path, name) 11 print(cmd) 12 subprocess.call(cmd,shell=True)

投稿2020/01/29 02:39

編集2020/01/29 05:04
can110

総合スコア38256

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

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

Danrussia

2020/01/29 03:28

回答ありがとうございます。 回答を得てこのようにコードを書き換えてみたのですが、上手く作動しませんでした。 このコードを実行した際に、runの時間がかなりかかってるので何らかの作業は行われているようなのですが...
can110

2020/01/29 05:05

他に気をつけるべき点も含めて回答に追記しました。
Danrussia

2020/01/29 05:26

回答ありがとうございます。上記のコードで意図する動作が起こりました。 今回の部分で解決のネックになってた部分は ・inkscapeを使う時にフルパスを導入する。 ・変数を文字列に埋め込む ためにformat関数やf-stringを使う という理解で合っていますか?
can110

2020/01/29 05:42

おおむねそうです。 ただし「変数を文字列に埋め込む ためにformat関数やf-stringを使う」のは必須ではありません。 +演算子でコマンド文字列を足しこんで作りこむこともできますがformatなりを使った方がコードの見通しがよくなります。 あと重要なのは、「パスにスペースを含む可能性がある場合はダブルクオーテーションで囲む」ことです。 これはPython上の話ではなくコマンドプロンプト上でコマンド実行するさいの注意事項となります。
Danrussia

2020/02/01 05:11

返信が遅くなってしまい、申し訳ありません。 ダブルクオーテーションの件(コマンドプロント内での仕様も含め)は知りませんでした。 今回の回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問