在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
。最后,使用此示例数据创建group1
和group2
,然后使用.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
。最后,使用此示例数据创建group1
和group2
,然后使用.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
尝试了这种方法,它成功了!。谢谢你尝试了这种方法,它成功了!。非常感谢。