जवाबों:
यह करने के लिए एक आसान तरीका उपयोग करने के लिए है StringIO.StringIO
(को Python2) या io.StringIO
(python3) और के पास है कि pandas.read_csv
कार्य करते हैं। उदाहरण के लिए:
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()
एक समान कार्य है, बस थोड़ा बेहतर नामकरण df = pd.read_table(TESTDATA, sep=";")
:।
pandas.compat.StringIO
। इस तरह हमें StringIO
अलग से आयात नहीं करना है । हालाँकि pandas.compat
पैकेज को pandas.pydata.org/pandas-docs/stable/api.html?highlight=compat के अनुसार निजी माना जाता है, इसलिए उत्तर को छोड़ना अभी के लिए है।
df.to_csv(TESTDATA)
, तो उपयोग करेंTESTDATA.seek(0)
विभाजन विधि
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(';')])
इंटरेक्टिव काम के लिए एक त्वरित और आसान समाधान क्लिपबोर्ड से डेटा लोड करके पाठ को कॉपी और पेस्ट करना है।
अपने माउस से स्ट्रिंग की सामग्री का चयन करें:
पायथन शेल के उपयोग में 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
उपयुक्त विभाजक का उपयोग करें:
>>> 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
स्ट्रिंग चर के रूप में डेटा संग्रहीत करने के लिए एक पारंपरिक चर-चौड़ाई CSV अपठनीय है। विशेष रूप से एक .py
फ़ाइल के अंदर उपयोग के लिए , इसके बजाय निश्चित-चौड़ाई वाले पाइप-पृथक डेटा पर विचार करें। विभिन्न आईडीई और संपादकों में पाइप-अलग पाठ को एक साफ तालिका में प्रारूपित करने के लिए एक प्लगइन हो सकता है।
read_csv
एक उपयोगिता मॉड्यूल में निम्न स्टोर करें, जैसे util/pandas.py
। एक उदाहरण फ़ंक्शन के डॉकस्ट्रिंग में शामिल है।
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)
नीचे दिया गया कोड ठीक से काम नहीं करता है क्योंकि यह बाएँ और दाएँ दोनों तरफ एक खाली कॉलम जोड़ता है।
df = pd.read_csv(io.StringIO(df_str), sep=r'\s*\|\s*', engine='python')
के रूप में read_fwf
, यह वास्तव में वैकल्पिक kwargs है कि read_csv
स्वीकार करता है और उपयोग करता है के कई का उपयोग नहीं करता है। जैसे, इसे पाइप से अलग किए गए डेटा के लिए बिल्कुल भी उपयोग नहीं किया जाना चाहिए।
read_fwf
लेता read_csv
है, लेकिन यह सच है कि कुछ का कोई प्रभाव नहीं है ।
सबसे आसान तरीका यह है कि आप इसे टेम्प फाइल में सेव करें और फिर इसे पढ़ें:
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=';')
अस्थायी फ़ाइल बनाने का सही तरीका: मैं पायथन में एक tmp फ़ाइल कैसे बना सकता हूँ?
from pandas.compat import StringIO
, यह देखते हुए कि यह वही वर्ग है जो Python के साथ आता है।