我在csv文件中有几个数据(相似的数据结构,但不相同),某些行的行和列大小不同。
例如,每个csv文件的前三行具有变化的列数,即:
----------------
Table | Format |
----------------
Code | Label | Index |
-----------------------------------------
a | b | c | d | e |
-----------------------------------------
看起来很难看,并且很难像熊猫一样读入。
我想制作表格,使其能够识别文件中列的最大长度,并在空白处添加任何填充以使尺寸相等。 即。
-----------------------------------------
Table | Format | pad | pad | pad |
-----------------------------------------
Code | Label | Index | pad | pad |
-----------------------------------------
a | b | c | d | e |
-----------------------------------------
到目前为止,我研究了读取熊猫并将标头添加到csv文件中的问题,但是由于每个csv文件的最大列数各不相同,因此我一直处于困境。
任何帮助或指针将不胜感激!
答案 0 :(得分:1)
如果列分隔符是逗号,则只需在每行的末尾插入适当数量的逗号即可进行填充。使用read_csv
熊猫将以NaN格式读取填充的值。
with open('/path/to/data.csv', 'r') as f:
data = f.read().split()
# Count the the number of columns in each line
cols = [row.count(',')+1 for row in data]
# Find the widest row
max_cols = max(cols)
# Loop over lines in text
for id, row in enumerate(data):
# Pad extra columns when necessary
if cols[id] < max_cols:
data[id] += (max_cols - cols[id]) * ','
# Write the data out
with open('/path/to/pad_data.csv', 'w') as f:
f.write('\n'.join(data))
设置一些测试数据:
data = '1,2,3\n4,\n5,6,7,8,9\n'
print(data)
#1,2,3
#4,
#5,6,7,8,9
应用上述方法可以得出:
print('\n'.join(pad_data))
#1,2,3,,
#4,,,,
#5,6,7,8,9
答案 1 :(得分:1)
这是我写的一个小脚本,用于填充从pandas数据框派生的列。我的文件是中间文件,以竖线分隔:
INPUT_FILE = r'blah.txt'
OUTPUT_FILE = r'blah.TAB'
col_widths = []
with open(INPUT_FILE, "r") as fi:
line = fi.readline()
headers = line.split(sep='|')
for h in headers:
col_widths.append(len(h))
with open(INPUT_FILE) as fi:
line = fi.readline()
while line:
cols = line.split(sep='|')
line = fi.readline()
index = 0
for c in cols:
if len(c) > col_widths[index]:
col_widths[index] = len(c)
index += 1
with open(INPUT_FILE) as fi:
fo = open(OUTPUT_FILE, 'w')
line = fi.readline()
while line:
tokens = line.split(sep='|')
index = 0
for t in tokens:
if index == len(col_widths) - 1:
t = t.rstrip('\r\n')
ft = '{:<' + str(col_widths[index]) + '}'
v = ft.format(t)
fo.write(v + '|')
index += 1
fo.write('\r')
line = fi.readline()
fo.close()