20190827のMacに関する記事は4件です。

【コピペでOK!】PythonでCSVファイルへの読み込み、書き込み

tl;dr

PythonでCSVファイルを読み書きする方法をまとめます。

用意するもの・環境

  • macOS Mojave 10.14.6
  • Python 3.7(ANACONDA3)
  • PyCharm 2019.2

開発環境の構築は下記の記事を参考にしてください。

【これさえ読めばOK】MacでPythonを使って開発するための準備
https://qiita.com/ryoichiro001/items/35a232a430c41dd512fa

公式ドキュメント

CSV ファイルの読み書き
https://docs.python.org/ja/3/library/csv.html

パラメータの詳細はこちらを参照してください。

CSVパッケージを使用する

import csv

CSVファイルの読み込み

import csv
import os


def get_info_from_csv(dir_name, file_name, delimiter=','):
    p_file = os.path.join(dir_name, file_name)

    with open(p_file, 'r', encoding='utf-8') as f:
        reader = csv.reader(f, delimiter=delimiter)
        lists = [row for row in reader]
        return lists

この例ではencodingをutf-8にしているが、これは読み込む対象のファイルに合わせる必要がある。

# 呼び出し例
url_list = get_info_from_csv('inputs_files', 'input.txt')

CSVファイルの書き込み

import csv
import os


def put_info_to_csv(lists, dir_name, file_name, header=[], delimiter=','):
    """二次元配列をCSVファイルに出力
    :param lists:出力したい二次元配列
    :param dir_name:ディレクトリ名(1階層下を想定)
    :param file_name:ファイル名
    :param header:ファイルのヘッダ
    :param delimiter:CSVの区切り文字
    :return:なし
    """
    p_file = os.path.join(dir_name, file_name)

    with open(p_file, "w", encoding='utf-8') as f:
        writer = csv.writer(f, delimiter=delimiter, quoting=csv.QUOTE_MINIMAL)

        if header:
            writer.writerow(header)

        writer.writerows(lists)
# 呼び出し例
out_info = [[]]
out_info.clear() # 2次元配列を初期化

count = 1

out_line = []
out_line.append(count)
out_line.append('A')
out_info.append(out_line)                        

count += 1

out_line = []
out_line.append(count)
out_line.append('B')
out_info.append(out_line)                        

count += 1

out_line = []
out_line.append(count)
out_line.append('C')
out_info.append(out_line)                        

put_info_to_csv(out_info, 'temporary_files', 'output.txt')
output.txt
1,A
2,B
3,C

参考URL

PythonでCSVファイルを読み込み・書き込み(入力・出力)
https://note.nkmk.me/python-csv-reader-writer/

Pythonで2次元配列の静的確保と動的確保
http://sonickun.hatenablog.com/category/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0?page=1402667101

Pythonでリスト(配列)の要素を削除するclear, pop, remove, del
https://note.nkmk.me/python-list-clear-pop-remove-del/

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MacOS MojaveでAllenNLPのインストールを失敗した話

はじめに

AllenNLPはいいぞ、、、 と聞いたので早速使ってみよう!としたらインストールに詰まったので原因と解決法です。インストール時に必要となる jsonnetをビルドする際に失敗する という問題ですが、結論から言うと、

  • 低いバージョン(High Sierra等)からのMacOS Mojaveへのアップグレードする際のC++ヘッダーの自動インストール漏れ

が原因です(元からMojaveがインストール済のMacBookの友人はすんなりインストールできたらしい、、、)。限定的な想定ですが、今後のMac OS Xのメジャーアップデートでも似た問題が発生する可能性はあるので、また調べ直さないように記事にします。
※OSの仕様による問題なのでMacの人向けです

問題

いろいろな導入方法があるのですがAnacondaを使ったやり方にします。

$ conda create -n allennlp python=3.6
# 3.6系最終版である3.6.9が勝手に指定されてインストールされます
$ conda activate allennlp
# 環境を切り替え
(allennlp) $ pip install allennlp

AllenNLP公式githubの説明では、「まっさらなPython3.6の環境を作ってpip installすればいいよ!!」って書いてあるので実行します。

...
Building wheel for jsonnet (setup.py) ... error
ERROR: Complete output from command //anaconda3/bin/python -u -c 'import setuptools, tokenize;__file__='"'"'/private/var/folders/q3/t9f6dwcd7qbfwhp4h3tn4ffm0000gn/T/pip-install-7bksxwcr/jsonnet/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' bdist_wheel -d /private/var/folders/q3/t9f6dwcd7qbfwhp4h3tn4ffm0000gn/T/pip-wheel-ab5wiufe --python-tag cp37:
ERROR: running bdist_wheel
running build
running build_ext
c++ -c -g -O3 -Wall -Wextra -Woverloaded-virtual -pedantic -std=c++0x -fPIC -Iinclude -Ithird_party/md5 -Ithird_party/json core/desugarer.cpp -o core/desugarer.o
c++ -c -g -O3 -Wall -Wextra -Woverloaded-virtual -pedantic -std=c++0x -fPIC -Iinclude -Ithird_party/md5 -Ithird_party/json core/formatter.cpp -o core/formatter.o
...

失敗します。 なんかC++周りでエラーが出てる???Pythonなのに???(情弱並感)

解決法

ググって見るとこの問題は割とよく起こっているみたいで、AllenNLPのGithub Issueでも話題に上がっています。このIssueによるとGoogleのjsonnetのIssueが参考になるよ!って書いてあります。さらにこの記事ではこのStackOverflowが役に立つよ!って書いてありました。たらい回しにしないで答えを書いて♡

どうやらMojave向けのC++のヘッダーがインストールされていないために参照エラーが発生しているらしく、

$ open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg

でヘッダーをインストールすれば解決するそうです。パッケージインストーラーが起動して指示通りに進めればOKです。自分はこの方法で解決しました。
インストールが終わって仮想環境内でpip install allennlpすれば晴れてAllenNLP導入完了です!!

余談

もしヘッダーのパッケージ(macOS_SDK_headers_for_macOS_10.14.pkg)が見つからない場合はDLする必要があるみたいですが、その方法は次の記事で紹介されています。

こちらの記事によると、

そもそも,macではCやC++のコンパイラはXCode由来のようで,OSアプデをした後にXCodeもアプデをしたのですが,そのアプデ内容に 「Mojave用のmacOS SDK headerがデフォルトで入っていないのが原因」みたいです.

普段からC++を書いてる人は気づきそうですがC++環境が元からインストールされている環境をバックエンド的に使ってると気づきませんね、、、

まとめ

  • C++によるパッケージビルド時のヘッダー参照エラーが原因
  • この問題はMojaveでC++を使ってビルドする他のパッケージでも起こりうる
  • 手動でヘッダーをインストールすれば解決
  • アップグレード時に自動でされるはずのパッケージインストールがされていないのが根本の原因
  • 今後のメジャーアップデート時にも似た問題が起こるかもしれない
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Macのターミナルで実行するとEOFが認識されない?

はじめに

競プロの問題を解いていてあまりググっても解決策が出てこない問題にぶつかったので記事にしておきますー!

EOFとは

AOJでこちらの問題 ALDS1_3_A を解いていて、 EOF というものを使うことが必要になった。EOFはEnd of Fileの略。意味は「ファイルの終わり」といったところでしょうか?
この問題では
while(scanf("%s", s) != EOF)
という使い方をしました。

ターミナルで実行するとEOFが認識されない

いつも通りコンパイルしてターミナルで実行すると、返り値が返ってきません。でも、AOJに提出するとAcceptedとなるのでコードは間違っていません。
どうやら先ほどのコードのwhileループが終わっていないようです。
ということは、入力が終わっても!=EOFになっている、つまり入力の終わりが認識されていないということですよね?

なんででしょう。

解決方法

実行時にEnterキーではなく Control+D を押す!
これで成功しました。

終わりに

ただのメモなのでどうしてこれで上手くいくのか、など詳しいことは分かりません。ガチプロの方教えていただければ幸いです、、。
もし同じ壁に詰まった方がいればこれをみて解決してもらえれば!と思います(^o^)/

参考ページ

https://stackoverflow.com/questions/21364313/signal-eof-in-mac-osx-terminal

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Windows10, MacでのPATHの通し方。パスの通し方。

環境

OS:windows10, MacOS 10.14.6

背景

PATHに関する解説はたくさんありますが、常用するような設定ではないため毎回調べないといけないので簡潔に忘備録を残します

PATHを通すとは

PATHを通すとはプログラム名のみで実行できる環境を作ること。
/aaa/bbb/cccにあるcccを実行する際に、コマンドライン上に/aaa/bbb/cccと入力しなければならないところ、cccと入力することで実行できるようにすることが目的。
これは、PATHという環境変数にディレクトリ登録することで可能となる

環境変数とは

環境変数とは、OSが使用出来る変数のことで、全体から参照出来る変数なのでそのOS内の全てのアプリケーションから参照する事が出来る

# 環境変数の確認コマンド
> printenv

# 出力結果にPATHというものがある
...
PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Applications/MAMP/Library/bin...
...

# 環境変数の使用は通常の変数のように'$'を始めにつければ良い
> echo $PATH 

# 出力結果
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Applications/MAMP/Library/bin...

上記出力結果の通りPATHは次のように:区切りで書かれており、左から優先的にパスの中を探して実行するようになっている。
実行したいプログラム名が入力されたとき、該当するパスになければ次のパスを探して、なければ次のパスを探すという流れ

# 現在の環境変数が前述の出力結果の場合、左から優先して探されるので次の順で探されることになる。
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Applications/MAMP/Library/bin...
# --------流れ--------
/usr/locak/bin
/usr/bin
/bin
/usr/sbin
/sbin
/Applications/MAMP/Library/bin
...

環境変数の設定

一時的に環境変数を設定する(再起動で元通り)

上記のPATHに対してexportコマンドを使うことでパスを追加できる。
追加したらsourceコマンドで反映させる。

# $PATHを左に書けば、最優先で探してくれる
> export PATH = $PATH:{追加したいパス}/bin

# $PATHを右に書けば、最後に探す項目として追加できる
> export PATH={追加したいパス}/bin:$PATH

# (例)
# composerというパッケージ管理ツールのパッケージに対してPATHを設定したい場合
# composer/vendorのディレクトリにパッケージが管理されている
# composer自体は現在は/usr/local/bin/に配置されているとする
#  => /usr/local/bin/composer/vendeorという状況
# ※'/usr/local/bin/' は '~' で表せる
# ※PATH設定の際は最後に`/bin`を書く必要がある
> export PATH=~/.composer/vendor/bin:$PATH

sourceコマンド実行でexportした結果を読み込み直すことができる

> source ~/.bash_profile
# or
> source ~/.zshrc

再起動後もPATHを通したままに設定する

OSにログインすると自動的に立ち上げられるファイルの中に次の2つがあり、このいずれかのファイルに上記export内容を追記することでOSログイン時にexportしてもらうようにする

bash:~/.bash_profile
zsh:~/.zshrc

※この場合OSログイン時に自動的にexportされるようになるため、sourceコマンドで読み込み直す必要はない

bashかzshどちらに追記するか

# 次のコマンドの出力内容の末尾が"bash"か"zsh"かでどちらのファイルに書き込むかを決める
> echo $SHELL

# 出力結果の末尾が次のように"bash"のとき、"~/.bash_profile"に書き込む
/bin/bash

# 出力結果の末尾が次のように"zsh"のとき、"~/.zshrc"に書き込む
/usr/local/bin/zsh

実際に追記する

# 設定ファイルに書き込む"~/.bash_profile"に書き込むとき
> vi ~/.bash_profile
# "i"でinsertして下記内容を追記し、"esc"でinsert終了し、":wq"で保存して閉じる
export PATH=~/.composer/vendor/bin

# zshの場合も同様
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む