如何将使用类似shell语法生成的空格分隔值(csv)文件读入DataFrame

vjrehmav  于 12个月前  发布在  Shell
关注(0)|答案(3)|浏览(159)

我正在寻找一个快速的方法来读取一个csv文件到Xplrame.该csv文件是一个空格分隔,然而,列名之间放置双引号,如果它包含一个以上的词&包含多个空格. pd.read_csv与sep=”“不工作,因为colomn名称空格.
我目前通过在文件的每一行上应用shlex.split来解决这个问题,将其改为逗号分隔。然而,这花费了太长的时间:对于一个15 K行的文件,大约需要6秒。下面是我的文件('template.csv')的示例和如何通过shlex.split解决它的代码片段。
提前感谢帮助!

a b c "d e  " "f g  " "h k  "
1 2 3 4 5 6
2 2 3 4 5 6
3 2 3 4 5 6
4 2 3 4 5 6
5 2 3 4 5 6
6 2 3 4 5 6

字符串
下面是代码和所需的嵌入式框架输出:

import pandas as pd
import shlex
data = []
df = pd.DataFrame()
for line in open(r'template.csv'):
    line = shlex.split(line)
    data.append(line)
df = pd.DataFrame(data[1:], columns=[colName for colName in data[0]])

   a  b  c d e f g h k
0  1  2  3   4   5   6
1  2  2  3   4   5   6
2  3  2  3   4   5   6
3  4  2  3   4   5   6
4  5  2  3   4   5   6
5  6  2  3   4   5   6

8qgya5xd

8qgya5xd1#

您可以设置分隔符:

# or suggested by @AndrejKesely, sep=r'\s+'
df = pd.read_csv('template.csv', sep=' ')
print(df)

# Output
   a  b  c  d e  f g  h k
0  1  2  3    4    5    6
1  2  2  3    4    5    6
2  3  2  3    4    5    6
3  4  2  3    4    5    6
4  5  2  3    4    5    6
5  6  2  3    4    5    6

字符串
也可以使用shlex,但只在第一行使用:

with open('template.csv') as fp:
    headers = shlex.split(fp.readline())
    df = pd.read_csv(fp, header=None, names=headers, sep=' ')

wb1gzix0

wb1gzix02#

您可以将csv模块与自定义的CSV一起使用,以有效地读取带有引号的列名的空格分隔文件。

import pandas as pd
import csv

with open('template.csv', 'r') as file:
    # Read the header line
    header = next(file)
    # Use csv.reader with a space as the delimiter and a double quote as the quote character
    reader = csv.reader(file, delimiter=' ', quotechar='"')
    # Extract the data
    data = list(reader)

# Create a DataFrame with the header and data
df = pd.DataFrame(data, columns=[colName.strip('"') for colName in header.split()])
print(df)

字符串

wgeznvg7

wgeznvg73#

在这种情况下,看起来你可以只使用delim_whitespace=True,(它相当于sep="\s+",尽管只应该使用其中一个),即任何空格都是分隔符,默认情况下,"是quotechar,所以:

df = pd.read_csv('template.csv', delim_whitespacebool=True)

字符串

相关问题