痔になりやすい生活習慣とは?

python3でExcel操作が出来るのかと興味本位で学習中です。
ググって下記のコードを実行してみましたがエラーが出ます。
WinでもMacでも試してみましたが、どちらも同じエラーです。

下記コードを1行ずつ書いて実行する(インタラクティブシェル?)でも試してみましたが、
1行目のimport openpyxl ではエラーがでず、2行目を実行した時にエラーが出ます。

import openpyxl
wb = openpyxl.load_workbook('testxl.xlsx')
wb.get_sheet_names()

を実行すると、下記のようなエラーがでます。

エラー①
Warning (from warnings module):
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/openpyxl/reader/worksheet.py", line 319
warn(msg)
UserWarning: Unknown extension is not supported and will be removed


ちなみに3行まとめて実行した場合には、3行目に対して下記のエラーが出ます。

エラー②
wb.get_sheet_names()
DeprecationWarning: Call to deprecated function get_sheet_names (Use wb.sheetnames).

そこで3行目をprint (wb.sheetnames)にしたら、エラー②は出なくなりましたが、相変わらずエラー①は出ます・・・。
まだ本やネットで検索しながら探り探りの超初心者ですので、お知恵を頂けたらと思います。

A 回答 (1件)

プログラムをするときは,エラーを読んで解決策を考えるようにしてください。


また,エラー (error) とワーニング (warning) は違うものであることにも注意してください。
warning の場合は,必ずしも間違っているとは限らないです。

エラー① は「サポートされていない拡張子が指定されている」という warning です。
これに関してはこの文章だけでは分からないのですが,
HPを見に行くと読み込みに失敗したときに,この warning が出るようになっているようです。
正しくないファイルを開いたか(存在しない,Excelでないファイルなど),
あるいは「条件付き書式」など特定の機能を含むファイルはサポートされていないようです。
あくまで warning なので,途中まで読み込めているかもしれません。

エラー② は「推奨されていない関数 get_sheet_names が使われた(wb.sheetnames を使え)」
と書かれた warning です。
おそらく正しく動いているので,print(wb.get_sheet_names()) とかやれば,
sheet の名前が表示されるのではないでしょうか。
ただし非推奨 (deprecation) なので,wb.sheetnames を使うようにしてください。

なぜスクリプトとして実行すると最初の warning が出なくなるのかは
よく分かりませんが,正しい excel ファイルを開いているかを確認すれば,
解決するのではないでしょうか。
    • good
    • 1
この回答へのお礼

ご丁寧なご回答、有難うございます。
エラーとワーニングの違いにも留意してまいります。

「正しいexcelファイルを」とのアドバイスでしたので、何度も確認してやり直し等しましたが、やっぱりエラー①(実際にはワーニングですが)の現象は消えません。「条件付き書式」などの件も考慮し、セルに入力のあるsheet1を削除して試してみましたが、やっぱりダメです。

Warning (from warnings module):
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/openpyxl/reader/worksheet.py", line 319
warn(msg)
UserWarning: Unknown extension is not supported and will be removed
['Sheet2', 'Sheet3']


シート2と3があるファイルを対象としたので、結果は合っていますがワーニングが出たままなので気になります。

お礼日時:2018/02/11 10:35

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aと関連する良く見られている質問

Q【Excel VBA】マクロでExcel自体を終了させたい

環境:WindowsXP、Excel2003

マクロでエクセルを終了(ブックを閉じて、アプリケーション自体も終了)させたいのですが、以下のコードではアプリケーションが閉じてくれません。

ThisWorkbook.Close
ExcObj.Quit
Application.Quit

どこか悪いところはありますでしょうか?

よろしくお願いします。

Aベストアンサー

普通に考えれば質問者のコードで上手くいきそうですが
hana-hana3さんの回答にもあるようにThisWorkBook.Closeでコード終了となりますので
Application.QuitをThisWorkBook.Closeの前にもってこないといけません。
Application.Quitはそれがあるプロシージャのコードが全て終わるまで
その実行を保留するちょと特別動作をします。

'-------------------------------------
 Application.Quit
 ThisWorkbook.Close
'-------------------------------------
 
 

Q[python] 文字列を変数名として使いたい

すいません教えて下さい。

pythonで以下の変数をセットしています。

aaa = 'hensu_name'

aaaで指定した'hensu_name'に対して値を入れたい場合は
どのように実装すればよいでしょうか?
(aaaに入れたstringを変数名にしたい)

よろしくお願いします。

Aベストアンサー

exec関数を使って文字列をコードとして実行すれば、それっぽいことができるように思います。
あまりいい例を思いつかないですが、以下のような感じでしょうか?

aaa = "hensu_name"
src = aaa + " = 'hello'" #srcの中身は、"hensu_name = 'hello'"

exec(src)
print hensu_name #hello が表示される

src = "print " + aaa #srcの中身は、"print hensu_name"
exec(src) #hello が表示される


ただ、No.1の方がおっしゃっているように、あまりお勧めな方法ではありません。
文字列をコードとして実行してしまうので、少々危険な側面もあります。
悪意のあるコードを含む文字列を実行してしまうとか…。

QEXCEL VBAマクロ作成で、他のEXCELからデータを取り込みたい

メインプログラム(EXCEL VBA)より、
他のフォルダーにあるEXCELの項目の内容を取り込みたいです。
たとえば他のフォルダーのEXCELのRange("A2:A3").ValueをメインプログラムのRange("C2:C3").Valueにセットしたい時です。

・コマンドボタン押したら、どこのEXCELから取り込むかのポップアップ(?)は、表示はできてます。
・作業者が選んだパスとブックもMsgBoxで表示できてるので、もらう相手の場所も取得できてます。

・となると次はOPEN,INPUTですか?
テキストデータの取り込みですと、Inputでそのバッファを定義してるのですが、なんか違うような。。。

よろしくお願いします!

Aベストアンサー

私がやる方法です。

Dim writeSheet As Worksheet ' 自分自身の書き出し先シート
Set writeSheet = ThisWorkbook.Worksheets(1) ' Sheet1 を参照

Dim readBook As Workbook ' 相手ブック
Set readBook = Workbooks.Open(filename) ' 相手ブックを開いて参照
Dim readSheet As WorkSheet ' 相手シート
Set readSheet = readBook.Worksheets("sheetName") ' 相手シートを参照
' または Set readSheet = readBook.Worksheets(sheetIndex)

' 例えば
writeSheet.Cells(1, 1).Value = readSheet.Cells(2, 2).Value ' 相手シートの B2 の値を自分自身の A1 に書き込む

readBook.Close False ' 相手ブックを閉じる
Set readSheet = Nothing
Set readBook = Nothing

私がやる方法です。

Dim writeSheet As Worksheet ' 自分自身の書き出し先シート
Set writeSheet = ThisWorkbook.Worksheets(1) ' Sheet1 を参照

Dim readBook As Workbook ' 相手ブック
Set readBook = Workbooks.Open(filename) ' 相手ブックを開いて参照
Dim readSheet As WorkSheet ' 相手シート
Set readSheet = readBook.Worksheets("sheetName") ' 相手シートを参照
' または Set readSheet = readBook.Worksheets(sheetIndex)

' 例えば
writeSheet.Cells(1, 1).Value = readSheet.Ce...続きを読む

QVBAでブックを非表示で開いて処理して閉じる方法

エクセルVBAで質問なのですが、別のブックを非表示で開いて処理をし、処理が終わったらそのブックを閉じるマクロを作りたいです。

ネットで方法をたくさん調べたのですが、うまくいきません。
ActiveWindow.Visible = Falseを使うと非表示でブックを開くのですが、次の処理をしようとすると非表示のブックのシートがselectで選択できないのかエラーが出てしまいます。

どなたか良い方法をご存じないでしょうか?


↓今作ろうとしているマクロを参考に書いておきます。

ブックA内に書かれているブックBを非表示で開く

処理(ブックBのシート内の表に記入漏れの空白セルがあればブックAに空白セルの番地を表示させる)

ブックBを非表示のまま閉じる


非表示にせずにブックBを開けばうまく処理が完了するのですが、ActiveWindow.Visible = Falseを入れて非表示でブックBを開くと処理が開始しないという状況です。

Aベストアンサー

こんにちは

>非表示のブックのシートがselectで選択できないのかエラーが出てしまいます。
手作業でも非表示のブックでシートやセルを選択しようとしても無理ですよね?

VBAの記述の方法をSelectやActivateなどを用いないように書き直せば、ご希望のことは実現可能だと思います。

例として、以下では"TestBook"というブックを開き、そのシート1内でA1:C20の範囲の空白セルを探して、メッセージボックスにカンマ区切りで結果を表示します。
(殆ど時間がかかりませんので、非表示にしなくても同じだとは思いますが…)

Sub sample()
 Dim wb As Workbook, c As Range
 Dim str As String

 str = ""
 Set wb = Workbooks.Open(ThisWorkbook.Path & "\TestBook.xlsm")
 Windows(wb.Name).Visible = False

 For Each c In wb.Worksheets(1).Range("A1:C20")
  If c = Empty Then
   If str <> "" Then str = str & " , "
   str = str & c.Address
  End If
 Next c
 wb.Close SaveChanges:=False

 MsgBox str
End Sub

※ わざわざ『非表示』に設定しなくても、現在のウィンドウをアクティブにすることで、新しく開いたウィンドウを(裏側に)隠すこともできますね。

こんにちは

>非表示のブックのシートがselectで選択できないのかエラーが出てしまいます。
手作業でも非表示のブックでシートやセルを選択しようとしても無理ですよね?

VBAの記述の方法をSelectやActivateなどを用いないように書き直せば、ご希望のことは実現可能だと思います。

例として、以下では"TestBook"というブックを開き、そのシート1内でA1:C20の範囲の空白セルを探して、メッセージボックスにカンマ区切りで結果を表示します。
(殆ど時間がかかりませんので、非表示にしなくても同じだとは思いま...続きを読む

Q別のシートから値を取得するとき

Worksheets("シート名").Activate
上記のを行ってから別シートの値を取得するのですが、
この処理を行うと指定したシートへ強制的にとんでしまいます。。。

※イメージ
For ~ To ~
  Worksheets("シートA").Activate
  シートAの値取得
       :
  Worksheets("シートB").Activate
  シートBの値取得
Next

このイメージ処理を行うとものすごい勢いで画面がチカチカします。。。
シートを変えずに他のシートから値を取得する方法はないのでしょうか。
教えてください!

Aベストアンサー

Worksheets("シートA").Range("A1")

みたいな感じでできませんか?

Qpython urlopen error について教えてください

pythonを、勉強したてです。
開発環境は、python2.6/win XP です。

HTMLを解析するために、
http://www.crummy.com/software/BeautifulSoup/ からライブラリーを入手して、C:\Python26\Lib\site-packages\BeautifulSoup-3.1.0.1 に配置しました。
python環境設定のパスは、通してあります。

プログラムは、http://www.freia.jp/taka/blog/169 の「myparser.py」をそのまま使いました。(動作テストのため)

------- 結果 --------
メッセージファイル名行位置
Traceback
<module>C:\Python26\src\myparser.py50
mainC:\Python26\src\myparser.py41
urlopenC:\Python26\Lib\urllib2.py124
openC:\Python26\Lib\urllib2.py383
_openC:\Python26\Lib\urllib2.py401
_call_chainC:\Python26\Lib\urllib2.py361
http_openC:\Python26\Lib\urllib2.py1130
do_openC:\Python26\Lib\urllib2.py1105
URLError: <urlopen error [Errno 11001] getaddrinfo failed>

ネットワーク環境は、プロキシ・サーバを返していますが、どうやっても上記のエラーで引っ掛かってしまいます。

pythonを、勉強したてです。
開発環境は、python2.6/win XP です。

HTMLを解析するために、
http://www.crummy.com/software/BeautifulSoup/ からライブラリーを入手して、C:\Python26\Lib\site-packages\BeautifulSoup-3.1.0.1 に配置しました。
python環境設定のパスは、通してあります。

プログラムは、http://www.freia.jp/taka/blog/169 の「myparser.py」をそのまま使いました。(動作テストのため)

------- 結果 --------
メッセージファイル名行位置
Traceback
<...続きを読む

Aベストアンサー

名前解決を行うgetaddrinfo関数がIOErrorを出してるんで
やっぱりプロキシがうまく刺さってないんじゃないですか?
プロキシを使う場合、クライアントは名前解決をしなくてもいいはずです。

一応、urllibライブラリはIEに設定されたプロキシの値を
レジストリから自動的に読み取るようになっています。
まずインターネット・オプションにプロキシが正しく
IPアドレスで指定されていることを確認してください。

それでもダメな場合は以下のように
スクリプト内で直接プロキシを指定してみます。
(127.0.0.1:8080の部分を使っているプロキシで置き換えてください)

urllib.urlopen(url, proxies={"http" : "http://127.0.0.1:8080"})

これでもtracebackに変化がなければ、
私では対処できません。

ちなみにurllibは初期のころから存在する使用頻度の高い標準ライブラリなので
2.6に対応していないとか、バグ入りだとかいう可能性はかなり低いと思います。

名前解決を行うgetaddrinfo関数がIOErrorを出してるんで
やっぱりプロキシがうまく刺さってないんじゃないですか?
プロキシを使う場合、クライアントは名前解決をしなくてもいいはずです。

一応、urllibライブラリはIEに設定されたプロキシの値を
レジストリから自動的に読み取るようになっています。
まずインターネット・オプションにプロキシが正しく
IPアドレスで指定されていることを確認してください。

それでもダメな場合は以下のように
スクリプト内で直接プロキシを指定してみます。
(127...続きを読む

Qpython print文のエラー

こんにちは。
今日、リカバリしたばかりのPCに、python3.1をインストールしコマンドラインモードからテスト代わりに

「print "Hello world!"」

と打って実行してみました。
しかし、「SyntaxError: invalid syntax」とエラーが出ます。
「print "Hello world!"」の最後の「"」でエラーが発生していると出たのですが、どういうことなのでしょうか。

pythonは始めたばかりで、参考書で最初に書いてあったのを実行してみたのですが…。しょっぱなからこれだと残念です。私の環境が悪いのかも知れませんが。

プログラミング経験はC、C++で中規模のアプリケーション、2Dゲームを作成した程度です。

お願いします。

Aベストアンサー

現時点でのPythonの書籍はおそらくver2.x用だと思いますが、Python3からいくつか文法が変更されています。
http://docs.python.org/3.0/whatsnew/3.0.html

printは、以前は構文でしたが、関数になったので、カッコが必須です。
print("Hello world!")

QPythonで元CSVファイルの一部列を抜き出す

Python初心者です。どうぞよろしくお願い致します。

インターネットを色々検索していますが苦戦していますので投稿させてください。

下記のような元CSVファイルから、不要な列だったり、空白の列をカットして
必要な列だけのCSVとして新たなファイルとして出力したいと思っています。

元CSVファイル (上からタイトル行とサンプル2行抜き出し)※Excelでの画像添付しています

ID,URI,body,text_author,text_flg,text_source,text_updatetime,text_url,DATE,DATE_2
1, csv://10.182.XXX, "comment A, comment B, comment C", Mr.A, , SourceA, , http://www.yahoo.co.jp, 1.37667E+12, 20130817
2, csv://10.183.XXX, "comment D, comment E, comment F", Mr.B, , SourceB, , http://www.goo.co.jp, 1.37667E+12, 20130817

(期待する出力結果)
body,text_author,text_source,text_url,DATE_2
"comment A, comment B, comment C", Mr.A, SourceA, http://www.yahoo.co.jp, 20130817
"comment D, comment E, comment F", Mr.B, SourceB, http://www.goo.co.jp, 20130817

つまり、元のファイルの列の(一番左がRow(0)として)Row(2),Row(3), Row(5), Row(7), Row(9)だけを
各行抜き出して新たなCSVファイルとして出力したいと思っています。
ちなみに行数は1000の場合も10000の場合もあります。

最初は、gawkで処理しようと思っていましたが、抜き出したいうちのひとつRow(2)には、
不定期で複数のカンマが含まれているため、gawkでは正しく列分類ができず、
Pythonを学習がてらうまくできないかと思っています。

実は締め切りが近いので結構あせっているのですが、(自分のセンスのなさにヘキヘキ・・)
どなたかこのようにCSVを処理できるPythonのやり方を教えて頂けないものでしょうか。

どうぞよろしくお願い致します。

Python初心者です。どうぞよろしくお願い致します。

インターネットを色々検索していますが苦戦していますので投稿させてください。

下記のような元CSVファイルから、不要な列だったり、空白の列をカットして
必要な列だけのCSVとして新たなファイルとして出力したいと思っています。

元CSVファイル (上からタイトル行とサンプル2行抜き出し)※Excelでの画像添付しています

ID,URI,body,text_author,text_flg,text_source,text_updatetime,text_url,DATE,DATE_2
1, csv://10.182.XXX, "comment A, comment B,...続きを読む

Aベストアンサー

#1補足について。

出力されたCSVを、テキストエディタで開いてください。
# Excelで開くと、中身が解釈されて、どんな状態か判断しずらくなります。
インタプリタでの出力と同じ内容になっているはずです。

インタプリタでの結果は
comment A, comment B, comment C Mr.A SourceA http://www.yahoo.co.jp 20130817
ですから、CSVとして解釈すると
comment A
comment B
comment C Mr.A SourceA http://www.yahoo.co.jp 20130817
の3項目となります。

出力させたいのは、
"comment A, comment B, comment C",Mr.A,SourceA,http://www.yahoo.co.jp,20130817
というのでは?

CSVで "~" と"でくくってあったら、その中身が項目の本体です。ですから、"を取った状態で取り込むのが普通です。
その状態が row[2]です。
逆に、CSVに出力するなら、 ""でくくらないと、項目内の文字としてのカンマではなく、項目区切りのカンマだと解釈されてしまいます。
ですから、"で括って出力するようにします。例えば、 '"'+row[2]+'"' とか。

printに,で複数の項目を指定すると、それぞれの間をスペースで区切って出力されます。
CSVとしてカンマ区切りにするなら、次の方法のいずれかを使います。
・文字列のjoinメソッドを使う(csvモジュールのマニュアルのサンプロコードにある例)
・数が固定なら、%で書式指定する
例) print '"%s",%s,%s,%s,%s' %(row[2], row[3], row[5], row[7], row[9])
・print関数のsep=で指定する。(Python3,あるいは2.6以降でprint関数有効時)
・csv.writerを使う

#1補足について。

出力されたCSVを、テキストエディタで開いてください。
# Excelで開くと、中身が解釈されて、どんな状態か判断しずらくなります。
インタプリタでの出力と同じ内容になっているはずです。

インタプリタでの結果は
comment A, comment B, comment C Mr.A SourceA http://www.yahoo.co.jp 20130817
ですから、CSVとして解釈すると
comment A
comment B
comment C Mr.A SourceA http://www.yahoo.co.jp 20130817
の3項目となります。

出力させたいのは、
"comment A, comment B, comment C",Mr.A...続きを読む

Q第一章→第一節・・・その次は?

よく目次で
第一章○○○
 第一節△△△
 第二節□□□
第二章◇◇◇~
とありますよね?その第一節をさらに分けたい場合、第一何となるのでしょうか。
ご存知の方よろしくお願いします。

Aベストアンサー

たまたま手元に「公用文作成の手引き」という冊子があります。
役所で使用する文書規定の本です。

これによると、章、節、項までは皆さんのおっしゃる通り。

さらに、「項目を細別する見出し符号は以下による。」とあります。

第一章 第二章・・・
 第一節 第二節・・・
  第一項 第二項・・・
   第1 第2
    1 2 3
     (1) (2) (3)
      ア イ ウ
       (ア) (イ) (ウ)
        A B C
         (A) (B) (C)
          a b c
          (a) (b) (c)

注1:「第1」を省略して「1」からはじめても良い。
注2:「イ」「ロ」「ハ」「ニ」は用いない。


以上のように書いてありました。
しかし、何にせよ法律で決まっているわけでもないし、通常は
自分の好みで選択して、問題ないと思います。

QWorkBooksをオープンさせずにシートにコピーしたい【EXCEL VBA】

よろしくお願いします。
今あるブックにあるシートを別のブックにコピーしたいのですが、今考えているのは

ここから////////
'ブックを開く
Workbooks.Open コピー元のブックのパス
'シートをコピー
Worksheets.Item(コピーするシート名).Copy _
after:=Workbooks(コピー先のブック名).Sheets(1)

'ブックを閉じる
Application.DisplayAlerts = False
Workbooks.Item(コピー元のブック名)Close True
Application.DisplayAlerts = True
ここまで////

なのですが、コピーものとのブックが複数ある時、画面がチラチラしてしまいます。ブックをオープンさせずにシートを他ブックにコピーさせる方法ってないでしょうか。
ご存知の方がいらっしゃいましたら、ご教授お願いします。

Aベストアンサー

画面のチラツキを押さえたいだけなら、画面の更新をやめればいいだけじゃないでしょうか?

ブックを開く前に
Application.ScreenUpdating = False
ブック閉じてから
Application.ScreenUpdating = True


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング