Câu trả lời:
Một cách đơn giản để làm điều này là sử dụng StringIO.StringIO
(python2) hoặc io.StringIO
(python3) và truyền nó cho pandas.read_csv
hàm. Ví dụ:
import sys
if sys.version_info[0] < 3:
from StringIO import StringIO
else:
from io import StringIO
import pandas as pd
TESTDATA = StringIO("""col1;col2;col3
1;4.4;99
2;4.5;200
3;4.7;65
4;3.2;140
""")
df = pd.read_csv(TESTDATA, sep=";")
pd.read_table()
là một chức năng tương đương, chỉ là danh pháp tốt hơn một chút : df = pd.read_table(TESTDATA, sep=";")
.
pandas.compat.StringIO
. Bằng cách đó, chúng tôi không phải nhập StringIO
riêng. Tuy nhiên, pandas.compat
gói được coi là riêng tư theo pandas.pydata.org/pandas-docs/urdy/api.html?highlight=compat vì vậy hãy để lại câu trả lời như hiện tại.
df.to_csv(TESTDATA)
, hãy sử dụngTESTDATA.seek(0)
Phương pháp phân chia
data = input_string
df = pd.DataFrame([x.split(';') for x in data.split('\n')])
print(df)
df = pd.DataFrame([x.split(';') for x in data.split('\n')[1:]], columns=[x for x in data.split('\n')[0].split(';')])
Một giải pháp nhanh chóng và dễ dàng cho công việc tương tác là sao chép và dán văn bản bằng cách tải dữ liệu từ bảng ghi tạm.
Chọn nội dung của chuỗi bằng chuột của bạn:
Trong trình bao Python, sử dụng read_clipboard()
>>> pd.read_clipboard()
col1;col2;col3
0 1;4.4;99
1 2;4.5;200
2 3;4.7;65
3 4;3.2;140
Sử dụng dấu phân cách thích hợp:
>>> pd.read_clipboard(sep=';')
col1 col2 col3
0 1 4.4 99
1 2 4.5 200
2 3 4.7 65
3 4 3.2 140
>>> df = pd.read_clipboard(sep=';') # save to dataframe
Không thể đọc được CSV có chiều rộng biến truyền thống để lưu trữ dữ liệu dưới dạng biến chuỗi. Đặc biệt là để sử dụng bên trong một .py
tệp, thay vào đó hãy xem xét dữ liệu được phân tách bằng ống có chiều rộng cố định. Nhiều IDE và trình soạn thảo khác nhau có thể có một plugin để định dạng văn bản được phân tách bằng ống thành một bảng gọn gàng.
read_csv
Lưu trữ sau đây trong một mô-đun tiện ích, ví dụ util/pandas.py
. Một ví dụ được bao gồm trong chuỗi của hàm.
import io
import re
import pandas as pd
def read_psv(str_input: str, **kwargs) -> pd.DataFrame:
"""Read a Pandas object from a pipe-separated table contained within a string.
Input example:
| int_score | ext_score | eligible |
| | 701 | True |
| 221.3 | 0 | False |
| | 576 | True |
| 300 | 600 | True |
The leading and trailing pipes are optional, but if one is present,
so must be the other.
`kwargs` are passed to `read_csv`. They must not include `sep`.
In PyCharm, the "Pipe Table Formatter" plugin has a "Format" feature that can
be used to neatly format a table.
Ref: https://stackoverflow.com/a/46471952/
"""
substitutions = [
('^ *', ''), # Remove leading spaces
(' *$', ''), # Remove trailing spaces
(r' *\| *', '|'), # Remove spaces between columns
]
if all(line.lstrip().startswith('|') and line.rstrip().endswith('|') for line in str_input.strip().split('\n')):
substitutions.extend([
(r'^\|', ''), # Remove redundant leading delimiter
(r'\|$', ''), # Remove redundant trailing delimiter
])
for pattern, replacement in substitutions:
str_input = re.sub(pattern, replacement, str_input, flags=re.MULTILINE)
return pd.read_csv(io.StringIO(str_input), sep='|', **kwargs)
Mã dưới đây không hoạt động đúng bởi vì nó thêm một cột trống ở cả bên trái và bên phải.
df = pd.read_csv(io.StringIO(df_str), sep=r'\s*\|\s*', engine='python')
Về phần read_fwf
, nó không thực sự sử dụng rất nhiều kwarg tùy chọn read_csv
chấp nhận và sử dụng. Vì vậy, nó hoàn toàn không nên được sử dụng cho dữ liệu được phân tách bằng đường ống.
read_fwf
có nhiều read_csv
đối số hơn so với tài liệu, nhưng đúng là một số không có hiệu lực .
Cách đơn giản nhất là lưu nó vào tệp tạm thời và sau đó đọc nó:
import pandas as pd
CSV_FILE_NAME = 'temp_file.csv' # Consider creating temp file, look URL below
with open(CSV_FILE_NAME, 'w') as outfile:
outfile.write(TESTDATA)
df = pd.read_csv(CSV_FILE_NAME, sep=';')
Cách đúng để tạo tệp tạm thời: Làm cách nào tôi có thể tạo tệp tmp trong Python?
from pandas.compat import StringIO
, lưu ý rằng đó là cùng một lớp với mã đi kèm với Python.