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

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

ただいまの
回答率

89.62%

3つ目のコマンドライン引数を認識していない?

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 711

kolobokkule

score 13

 前提・実現したいこと

既存のエクセルシートに空行を入れるプログラムを書いています。
コマンドライン引数の第一引数をN、第二引数をMとすると、シートのN行目に、M行の空行が挿入されるといった形です。
第三引数に既存のファイルの名前を入れて実行したいのですが、そのファイルを認識させることができません。
.pyと.xlsxは同じディレクトリに入れた状態で.batを作成し、そのディレクトリにパスを通してWin + Rから「ファイル名を指定して実行」を行っています。

第三引数に渡したファイルを認識させる方法が知りたいです。
問題の可能性としてあげられるもの、なんでも結構ですのでよろしくお願いします。

 発生している問題・エラーメッセージ

Traceback (most recent call last):
  File "C:\Users\owner\PythonScripts\blankRowInserter.py", line 20, in <module>
    wb = openpyxl.load_workbook(src)
  File "C:\Users\owner\Anaconda3\lib\site-packages\openpyxl\reader\excel.py", line 175, in load_workbook
    archive = _validate_archive(filename)
  File "C:\Users\owner\Anaconda3\lib\site-packages\openpyxl\reader\excel.py", line 122, in _validate_archive
    archive = ZipFile(filename, 'r', ZIP_DEFLATED)
  File "C:\Users\owner\Anaconda3\lib\zipfile.py", line 1182, in __init__
    self.fp = io.open(file, filemode)
FileNotFoundError: [Errno 2] No such file or directory: 'example.xlsx'

 該当のソースコード

#! python3
# blanlRowInserter.py - 空行を挿入する

import openpyxl
import sys

if len(sys.argv) < 4:
    sys.exit("""
Usage: python blankRowInserter.py N M src.xlsx
  N = start row number (1..)
  M = the number of blank rows
""")

n = int(sys.argv[1])
m = int(sys.argv[2])
src = sys.argv[3]

wb = openpyxl.load_workbook(src)
sheet = wb.active

new_wb = openpyxl.Workbook()
new_sheet = new_wb.active

for row in range(1, sheet.max_row + 1):
    if row < n:     # コマンドライン引数Nが行の最大値よりも大きい場合、空行を挿入しない
        new_row = row #
    else:
        new_row = row + m   # m行分の空行を空ける

    for col in range(1, sheet.max_column + 1):
        old_cell = sheet.cell(column=col, row=row)
        new_cell = new_sheet.cell(column=col, row=new_row)
        new_cell.value = old_cell.value

new_wb.save(src + '.ins.xlsx')
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

引数でのファイル名指定を、相対パスで行った場合は、プログラムからの相対じゃなくて、カレントディレクトリからの相対になります。

Win + Rから「ファイル名を指定して実行」

の場合は、カレントディレクトリは、%HOMEDRIVE%%HOMEPATH%だったと思います。

案1:ファイルを絶対パスで指定する
案2:スクリプト内で、スクリプトのありかにカレントディレクトリを移動させる
os.chdir(os.path.dirname(__file__))

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/24 00:09

    絶対パスで指定したところ何の問題もなく動きました!ありがとうございます。
    案2のほうも試したいと思います。
    早いレスポンスで大変助かりました。

    キャンセル

  • 2018/11/24 00:11

    絶対パスで指定したところ、問題なく動いてくれました。
    案2のほうも試してみたいと思います。
    レスポンスが早くて大変助かりました。ありがとうございました。

    キャンセル

+1

とりあえず、.pyの上の方の行に

import os

print(os.getcwd())


等と入れて、実行時のカレントディレクトリを見てみると良いのでは。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/24 00:12

    回答ありがとうございました。

    キャンセル

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

  • ただいまの回答率 89.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる