在Python中,如何基于字符串值将文件分组到一行中?

在Python中,如何基于字符串值将文件分组到一行中?,python,jupyter-notebook,Python,Jupyter Notebook,输入文件中的数据采用这种格式 XD56783E clutch.pdf brake0.pdf brake1.pdf XT6111GT clutch.pdf brake0.pdf brake1.pdf brake2.pdf brake3.pdf 预期输出应为 XD56783E clutch.pdf brake0.pdf brake1.pdf XT6111GT clutch.pdf brake0.pdf brake1.pdf brake2.pdf brake3.pdf 下面

输入文件中的数据采用这种格式

XD56783E
clutch.pdf
brake0.pdf
brake1.pdf
XT6111GT
clutch.pdf
brake0.pdf
brake1.pdf
brake2.pdf
brake3.pdf
预期输出应为

XD56783E    clutch.pdf  brake0.pdf  brake1.pdf
XT6111GT    clutch.pdf  brake0.pdf  brake1.pdf  brake2.pdf  brake3.pdf
下面的代码不提供上述所需的输出

写了一个简单的模糊代码:

check_filetype=['c','b']
修订数据=无
温度=无
对于open中的keyvalue(“sampl.txt”):
如果键值[0]中的“X”:
ReviedData=keyvalue.strip()+“”
其他:
如果键值[0]中的“c”或“b”:
temp=keyvalue.strip()
ReviedData=ReviedData+“”+温度
打印(修订数据)

您可以使用
pandas
库读取
.groupby
''中的数据,并根据需要进行转换。加入
以将组集合在一起。如果字符串包含大写字母
X
,则用于创建组的代码将返回
True
False
True
False
是实际分别表示
1
0
布尔值,因此当您计算
[True,False,False,True,False,False,False]
的累计和时,您将得到
[1,1,1,2,2,2]
。例如,要计算最后2个,计算是
(1+0+0+0+1+0+0+0+0+0+0)
,而第二个
1
的计算是
1+0
。最后,使用此示例数据创建group
1
和group
2
,然后使用
.groupby
,以便根据需要将不同行中的值合并为一个字符串

import pandas as pd
df = pd.read_csv('sampl.txt', header=None)
df = df.groupby(df[0].str.contains('X').cumsum().astype(str))[0].apply(' '.join)
df.to_csv('sampl.txt', index=False)
df

Out[1]:
0
1            XD56783E clutch.pdf brake0.pdf brake1.pdf
2    XT6111GT clutch.pdf brake0.pdf brake1.pdf brak...

您可以使用
pandas
库读取中的数据,并根据需要使用
.groupby
''进行转换。加入
以将组集合在一起。如果字符串包含大写字母
X
,则用于创建组的代码将返回
True
False
True
False
是实际分别表示
1
0
布尔值,因此当您计算
[True,False,False,True,False,False,False]
的累计和时,您将得到
[1,1,1,2,2,2]
。例如,要计算最后2个,计算是
(1+0+0+0+1+0+0+0+0+0+0)
,而第二个
1
的计算是
1+0
。最后,使用此示例数据创建group
1
和group
2
,然后使用
.groupby
,以便根据需要将不同行中的值合并为一个字符串

import pandas as pd
df = pd.read_csv('sampl.txt', header=None)
df = df.groupby(df[0].str.contains('X').cumsum().astype(str))[0].apply(' '.join)
df.to_csv('sampl.txt', index=False)
df

Out[1]:
0
1            XD56783E clutch.pdf brake0.pdf brake1.pdf
2    XT6111GT clutch.pdf brake0.pdf brake1.pdf brak...

当前代码不起作用,因为每次程序找到以
X
开头的行时,
revisedData
将被分配一个新值,并且上一个值将重叠。要解决这个问题,您只需更改线路即可

revisedData = None
...
if 'X' in keyvalue[0]:
    revisedData = keyvalue.strip() + ' '

以便将新值添加到字符串的末尾。但是对于使用字符串的操作,我建议您使用数组来管理它,因为更改值更有效

除此之外,如果keyvalue[0]
中的“X”为
,则可以使用
startswith
来实现相同的效果。代码的另一个问题是,在以
X
开头的每一行后面都应该有一个新行。因此,修订后的守则如下:

check_filetype = ['c', 'b']

revisedData = []

for keyvalue in open("sampl.txt"):
    if keyvalue.startswith('X'):
        # Note that the newline is in the front of the string, because you want the elements that follow to be in the same line
        revisedData.append("\n" + keyvalue.strip())
    else:
        if keyvalue.startswith(('c','b')):
            revisedData.append(keyvalue.strip())

# Passing the array to join " " will create a result with all the elements in the array separated by " "
revisedData = " ".join(revisedData).strip()

print(revisedData)
输出

XD56783E clutch.pdf brake0.pdf brake1.pdf 
XT6111GT clutch.pdf brake0.pdf brake1.pdf brake2.pdf brake3.pdf

当前代码不起作用,因为每次程序找到以
X
开头的行时,
revisedData
将被分配一个新值,并且上一个值将重叠。要解决这个问题,您只需更改线路即可

revisedData = None
...
if 'X' in keyvalue[0]:
    revisedData = keyvalue.strip() + ' '

以便将新值添加到字符串的末尾。但是对于使用字符串的操作,我建议您使用数组来管理它,因为更改值更有效

除此之外,如果keyvalue[0]
中的“X”为
,则可以使用
startswith
来实现相同的效果。代码的另一个问题是,在以
X
开头的每一行后面都应该有一个新行。因此,修订后的守则如下:

check_filetype = ['c', 'b']

revisedData = []

for keyvalue in open("sampl.txt"):
    if keyvalue.startswith('X'):
        # Note that the newline is in the front of the string, because you want the elements that follow to be in the same line
        revisedData.append("\n" + keyvalue.strip())
    else:
        if keyvalue.startswith(('c','b')):
            revisedData.append(keyvalue.strip())

# Passing the array to join " " will create a result with all the elements in the array separated by " "
revisedData = " ".join(revisedData).strip()

print(revisedData)
输出

XD56783E clutch.pdf brake0.pdf brake1.pdf 
XT6111GT clutch.pdf brake0.pdf brake1.pdf brake2.pdf brake3.pdf

尝试了这种方法,它成功了!。谢谢你尝试了这种方法,它成功了!。非常感谢。