Eine herkömmliche CSV mit variabler Breite ist zum Speichern von Daten als Zeichenfolgenvariable nicht lesbar. .py
Berücksichtigen Sie stattdessen speziell für die Verwendung in einer Datei Rohrleitungsdaten mit fester Breite. Verschiedene IDEs und Editoren verfügen möglicherweise über ein Plugin zum Formatieren von durch Pipes getrenntem Text in eine übersichtliche Tabelle.
Speichern Sie Folgendes in einem Dienstprogrammmodul, z util/pandas.py
. Ein Beispiel ist in der Dokumentzeichenfolge der Funktion enthalten.
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)
Nicht funktionierende Alternativen
Der folgende Code funktioniert nicht richtig, da links und rechts eine leere Spalte hinzugefügt wird.
df = pd.read_csv(io.StringIO(df_str), sep=r'\s*\|\s*', engine='python')
Was read_fwf
es eigentlich nicht verwenden so viele der optionalen kwargs die read_csv
und Anwendungen akzeptiert. Daher sollte es überhaupt nicht für Daten verwendet werden, die durch Rohrleitungen getrennt sind.
from pandas.compat import StringIO
. Beachten Sie dabei, dass es sich um dieselbe Klasse handelt wie die, die mit Python geliefert wird.