Python_rawfile_location_notebook

4 minute read

파일경로 패키지 경로 관련 노트북 정리

파일경로 관련 궁금한 것

  1. 파일로드할때의 종류.
    1. 절대경로
    2. 상대경로.
  2. 왜 파이썬에는 windows 경로 문자인 \ 가 인식이 안되는가?

1. 파일로드 할때의 종류

## A. 절대경로

  • 그냥 절대경로로 읽으니 에러가 뜸.
    • OSError: Initializing from file failed
    • stackoverflow에 보니 permission이 안된다고 함.
  • 해결법은 아래와 같이 engine=’python’을 파라미터로 넘겨주니 됨.ㅋ
  • 참고 사이트 https://programmersought.com/article/91811966388/
import pandas as pd

file = 'C:/study_2018/python_study_2018/200830_파일경로 및 패키지 경로/b/b-2/input/train.csv'
df = pd.read_csv(file, sep=',', engine='python')
df.head()
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S
1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C
2 3 1 3 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S
3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 0 113803 53.1000 C123 S
4 5 0 3 Allen, Mr. William Henry male 35.0 0 0 373450 8.0500 NaN S

B. 상대경로

  • 일반적으로는 상대경로로 파일의 위치를 지정한다.
    • 캐글이나 쥬피터 노트북때도 상대경로로 한다.
  • 단 기준위치가 명확해야 한다.
    • 기준위치를 알기 위해서는 os 라이브러리를 활용한다.
  • 쥬피터 노트북을 사용할때는 일반적으로 작업폴더가 상대경로의 기준인데 즉 노트북파일의 위치가 기준이다.

  • 현재 파일의 경로 확인
    • os.getcwd() 활용
import os
print(os.getcwd())
C:\study_2018\python_study_2018\200830_파일경로 및 패키지 경로\b\b-2

여러 폴더에 있는 파일의 상대경로

  • 현재 편집중인 노트북은 위와 같이 b-2 폴더에 존재
  • train.csv를 아래의 총 5군데에 배치했다.
    1. ‘b-2’
    2. ‘c-1’
    3. ‘b’
    4. ‘a’
    5. ‘a-1’
  • “현재 파일의 경로 = 작업디렉토리” 인 상황에서 각각의 train.csv 파일을 어떻게 읽는지 해보자.
    • train.csv는 각폴더이름을 뒤에 붙인 파일이름으로 수정했다.
    • 잘열리는지 확인하자.
  • 각 파일의 위치를 file에 저장하고 os.path.abspath() 함수로 절대위치를 확인하여 잘가져왔나 확인하자.
#200830_파일경로 및 패키지 경로/
# ├── a/
# │   ├── a-1/
# │   │   └── train_a-1.csv
# │   ├── a-2/
# │   └── train_a.csv
# └── b/
#     ├── b-1/
#     │   └── train_b-1.csv
#     ├── b-2/
#     │   ├── 200830_파일경로 및 패키지 경로.ipynb ★-> 현재 노트북 파일 위치
#     │   ├── c-1/
#     │   │   └── train_c-1.csv
#     │   ├── c-2/
#     │   └── train_b-2.csv
#     └── train_b.csv

1. b-2 폴더

  • 현재 폴더의 파일을 가져오는 것은 제일 쉽다.
  • 그냥 파일이름만 넘기면 된다.
# b-2폴더(현재 작업폴더)의 파일 불러오기
file = 'train_b-2.csv'
print(os.path.abspath(file))
pd.read_csv(file, sep=',').head(1)
C:\study_2018\python_study_2018\200830_파일경로 및 패키지 경로\b\b-2\train_b-2.csv
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.25 NaN S

2. c-1 폴더

  • 현재 폴더의 하위 폴더 부터 살짝헷갈린다.
  • 그냥 ‘/c-1/train_c-1.csv’로 하면 파일이 없다고 한다.
  • 현재 폴더를 뜻하는 점한개를 붙힌 후 ‘./c-1/train_c-1.csv’와 같이 경로를 지정해줘야한다.
# c-1폴더(하위 폴더)의 파일 불러오기
file = './c-1/train_c-1.csv'
print(os.path.abspath(file))
pd.read_csv(file, sep=',').head(1)

C:\study_2018\python_study_2018\200830_파일경로 및 패키지 경로\b\b-2\c-1\train_c-1.csv


PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.25 NaN S

3. b 폴더

  • 이제 조금씩 헷갈린다.
  • 현재폴더가 점 한개. 그럼 상위는 점 두개다.
  • 마치 90년대 자주 사용한 MS-DOS 명령어에서 cd.은 현재폴더, cd..은 상위폴더로 갔던 그 시대의 느낌을 살려보자.
# b폴더(상위폴더)의 파일 불러오기
file = '../train_b.csv'
print(os.path.abspath(file))
pd.read_csv(file, sep=',').head(1)
C:\study_2018\python_study_2018\200830_파일경로 및 패키지 경로\b\train_b.csv
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.25 NaN S

4. a 폴더

  • 설명하기도 어려운 경로다.
  • b-2의 아빠는 b, 할아버지폴더는 ‘200830_파일경로 및 패키지 경로’인데. 그 자식중 하나인 a폴더의 파일을 불러온다.
  • 즉 삼촌 폴더다.
  • 그냥 점을 늘리는 것으로 실수할 수 있다.(나도 실수했다.)
  • ‘…/a/train.csv’는 틀리다. ‘…‘(점 3개)이란 문법은 없다. 아까 MS-DOS 시절을 생각해보자고 했다.
  • ’..’이 상위폴더면 2단계상위는?? ‘../../’이다.
  • 이렇게 헷갈리게 폴더구조를 만들지 말자. 하위에 넣으면 간단하다. 이것은 그냥 이런경우도 있을수 있으므로 참고만 하자.
# a폴더(상위*2의 하위폴더)의 파일 불러오기
file = '../../a/train_a.csv'
print(os.path.abspath(file))
pd.read_csv(file, sep=',').head(1)
C:\study_2018\python_study_2018\200830_파일경로 및 패키지 경로\a\train_a.csv
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.25 NaN S

5. a-1 폴더

  • 4번 a 폴더가 난관이었고 그 하위인 a-1은 오히려 간단하다.
# a-1폴더(상위*2의 하위*2 폴더)의 파일 불러오기
file = '../../a/a-1/train_a-1.csv'
print(os.path.abspath(file))
pd.read_csv(file, sep=',').head(1)
C:\study_2018\python_study_2018\200830_파일경로 및 패키지 경로\a\a-1\train_a-1.csv
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.25 NaN S

※ 추가 보너스

  • 작업폴더를 바꾸려면? os.chdir() 사용한다.
    • 마치 도스 시절의 ‘cd 폴더명’과 같은 느낌.
  • 작업폴더가 바뀌면 위의 파일 읽어오는것도 작업폴더기준으로 바뀌게 된다.
print("현재작업폴더 : {}".format(os.getcwd()))

# 작업폴더를 C:\로 변경
os.chdir("C:/")
print("변경후작업폴더 : {}".format(os.getcwd()))
현재작업폴더 : C:\study_2018\python_study_2018\200830_파일경로 및 패키지 경로\b\b-2
변경후작업폴더 : C:\
# 변경된 작업폴더의 파일 불러오기
file = 'train_c-drive.csv'
print(os.path.abspath(file))
pd.read_csv(file, sep=',').head(1)
C:\train_c-drive.csv
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.25 NaN S

2. 왜 파이썬에는 windows 경로 문자인 \ 가 인식이 안되는가?

  • \가 file str안에 인식안되는 이유는 간단하다.
    • 바로 \가 Escape Character이기 때문이다.
    • 참고링크 : https://docs.python.org/2.0/ref/strings.html
    • \n, \t, \등 str에서 특수한 기능을하는 escape sequence의 시작 문자이기 때문에 단순 \는 다음문자가 무엇인가에 따라 전혀 다른 뜻이 된다.
    • 예를 들면 ‘C:\test'로 경로를 입력하면 가운데 \t를 tab으로 인식하게 된다.
    • 그래서 경로를 위해 문자를 파이썬에서는 백슬래쉬 2개인 \ \나 포워드슬래시 /로 구분한다.
    • (※ \ : BACKSLASH, / : FORWARDSLASH -> 영어사전참고함)
  • 윈도우 경로를 그럼 어떻게 인식하게 효율적으로하는가?
    • A. 경로 str앞에 r붙이기
    • B. str.replace 함수이용하기

A. 윈도우형식 파일경로 str 앞에 r 붙이기

  • r을 붙이면 escape sequence가 무시되어 경로 그대로를 반환한다.
  • \로 입력한것들이 다 \ \로 변환됨을 알 수 있다.
파일경로 = r'C:\study_2018\python_study_2018\200830_파일경로 및 패키지 경로\b\b-2'
파일경로
'C:\\study_2018\\python_study_2018\\200830_파일경로 및 패키지 경로\\b\\b-2'

B. str.replace() 함수 이용하기

  • 안된다. SyntaxError: EOL while scanning string literal 라고 에러가 뜬다.
  • \ \ 자체도 인식이 안된다.ㅜ
  • 그냥 A방법만 사용하자
파일경로_before = 'C:\study_2018\python_study_2018\200830_파일경로 및 패키지 경로\b\b-2'
print('변경 전 파일경로 :', 파일경로_before)
파일경로_after = 파일경로_before.replace('\', '/')
print('변경  파일경로 :', 파일경로_after)
  File "<ipython-input-116-d18034d88900>", line 3
    파일경로_after = 파일경로_before.replace('\', '/')
                                              ^
SyntaxError: EOL while scanning string literal

Updated: