Day6 os.path.join 設置問題
爬了之前的回答,將application_train.csv檔案放入ipynb檔相同的資料夾底下,但是仍然無法成功讀取到csv檔案。
只有直接利用下面一程式碼才能成功讀取csv檔
app_train = pd.read_csv('application_train.csv')
以下為錯誤訊息:
---------------------------------------------------------------------------
FileNotFoundError Traceback (most recent call last)
<ipython-input-48-cba3a2d69f89> in <module>
3 dir_data = 'ML_marathon/Day_006'
4 f_app_train = os.path.join(dir_data, 'application_train.csv')
----> 5 app_train = pd.read_csv(f_app_train)
6
7 # data_folder = os.path.join('ML_marathon', 'Day_006')
D:\Anaconda_JupyterNotebook\lib\site-packages\pandas\io\parsers.py in parser_f(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, squeeze, prefix, mangle_dupe_cols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, skipfooter, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, dayfirst, cache_dates, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, doublequote, escapechar, comment, encoding, dialect, error_bad_lines, warn_bad_lines, delim_whitespace, low_memory, memory_map, float_precision)
674 )
675
--> 676 return _read(filepath_or_buffer, kwds)
677
678 parser_f.__name__ = name
D:\Anaconda_JupyterNotebook\lib\site-packages\pandas\io\parsers.py in _read(filepath_or_buffer, kwds)
446
447 # Create the parser.
--> 448 parser = TextFileReader(fp_or_buf, **kwds)
449
450 if chunksize or iterator:
D:\Anaconda_JupyterNotebook\lib\site-packages\pandas\io\parsers.py in __init__(self, f, engine, **kwds)
878 self.options["has_index_names"] = kwds["has_index_names"]
879
--> 880 self._make_engine(self.engine)
881
882 def close(self):
D:\Anaconda_JupyterNotebook\lib\site-packages\pandas\io\parsers.py in _make_engine(self, engine)
1112 def _make_engine(self, engine="c"):
1113 if engine == "c":
-> 1114 self._engine = CParserWrapper(self.f, **self.options)
1115 else:
1116 if engine == "python":
D:\Anaconda_JupyterNotebook\lib\site-packages\pandas\io\parsers.py in __init__(self, src, **kwds)
1889 kwds["usecols"] = self.usecols
1890
-> 1891 self._reader = parsers.TextReader(src, **kwds)
1892 self.unnamed_cols = self._reader.unnamed_cols
1893
pandas\_libs\parsers.pyx in pandas._libs.parsers.TextReader.__cinit__()
pandas\_libs\parsers.pyx in pandas._libs.parsers.TextReader._setup_parser_source()
FileNotFoundError: [Errno 2] File ML_marathon/Day_006\application_train.csv does not exist: 'ML_marathon/Day_006\\application_train.csv'
---------------------------------------------------------------------------
嘗試利用下面這一篇文章來解決問題,同樣出現錯誤
[How to set the os.path](https://medium.com/@ageitgey/python-3-quick-tip-the-easy-way-to-deal-with-file-paths-on-windows-mac-and-linux-11a072b58d5f#:~:text=To%20use%20it%2C%20you%20just,for%20the%20current%20operating%20system.)
<Method 1>
dir_data = 'ML_marathon/Day_006'
f_app_train = os.path.join(dir_data, 'application_train.csv')
app_train = pd.read_csv(f_app_train)
<Method 1>
data_folder = os.path.join('ML_marathon', 'Day_006')
file_to_open = os.path.join(data_folder, r'application_train.csv')
app_train = pd.read_csv(file_to_open)
Q1: 想請問我這樣設置os.path有錯誤嗎?
Q2: 我可以如何修改我的程式碼來建立os.path?
謝謝
回答列表
-
2020/07/28 上午 10:36楊人豪贊同數:2不贊同數:0留言數:0
在錯誤訊息中有出現路徑設置錯誤的訊息以及電腦讀取設置後的結果
FileNotFoundError: [Errno 2] File ML_marathon/Day_006\application_train.csv does not exist: 'ML_marathon/Day_006\\application_train.csv'
其中ML_marathon/Day_006\\application_train.csv是電腦辨識的結果
Method有兩個小問題
1.在路徑設置上有個小陷阱"斜線的方向不同"
也就是在Unix作業系統(Linux或是Mac)路徑是
/home/jsmith/Documents/file.txt
Windows上是
C:\Users\jsmith\Documents\file.txt
在python中如果手動寫出完整路徑(也就是不用path.join)
路徑會寫成雙反斜線"
C:\\Users\\jsmith\\Documents\\file.txt"
你可以注意到錯誤訊息中Python把你的路徑變成"ML_marathon/Day_006\\application_train.csv"
兩種斜線混在一起了
所以路徑可以寫成ML_marathon\\Day_006但是問題只解決一半
2.問題的另一半在於"絕對路徑"與"相對路徑"
app_train =pd.read_csv('application_train.csv')之所以會成功是因為他是讀取相對路徑
也就是說他會尋找跟程式相同資料夾下有沒有application_train.csv
而在Method1,2中多加了dir_data='ML_marathon/Day_006'
因此電腦會從ipynb檔所在的資料夾尋找ML_marathon/Day_006資料夾
如果需要就必須給出絕對路徑
例如:d:\\some_folder1\\some_folder2\\application_train.csv
之後如果我有試出結果再回復到這裡
-
2020/07/28 下午 00:03張維元 (WeiYuan)贊同數:1不贊同數:0留言數:0
嗨,以下簡單回覆你的問題:
Q1: 想請問我這樣設置os.path有錯誤嗎?
Q2: 我可以如何修改我的程式碼來建立os.path?
=> 如果你從文件來看的話用法應該是這樣:os.path.join('a', 'b', 'c') ,是給很多層的位置(不用拼起來),os.path.join 會替你產生不同環境所需要的路徑結構。會需要使用的原因是「不同作業系統的路徑設定不一樣」,例如斜線的方向是有差異的。
所以,當你寫成這樣「os.path.join('ML_marathon/Day_006', 'application_train.csv')」的時候,在不同的環境會被轉換以下兩種:
* 'ML_marathon/Day_006/application_train.csv'
* 'ML_marathon/Day_006\application_train.csv'
因此會導致問題,所以比較好的寫法還是改用 os.path.join('ML_marathon', 'Day_006', 'application_train.csv') 比較符合原本的用法。
另外補充一點,其實我不太建議使用 os.path.join ,因為這是會從電腦的目錄開始找,有可能你的資料跟程式是分開的情況,我會建議不要這麼做。比較好的方法是「統一把程式跟資料放在同一個資料夾內」,然後這樣寫就好:
* pd.read_csv('application_train.csv') => 存取程式相同目錄下的 application_train.csv
* pd.read_csv('data/application_train.csv') => 存取程式相同目錄下的 data 資料夾下的 application_train.csv
用這兩種方法會是以「程式為主」的相對路徑,使用上比較乾淨也單純。
如果這個回答對你有幫助請主動點選「有幫助」或「最佳解答」的按鈕,也可以追蹤我的GITHUB 帳號。若還有問題的話,也歡迎再開一個新的問題繼續發問(留言在原本的討論底下我可能不會回覆)或者把你理解的部分整理上來,我都會提供你 Review 和 Feedback 😃😃😃