如何在Python中去除字符串末尾的逗号?

3
我该如何从字符串末尾删除逗号?我尝试了
awk = subprocess.Popen([r"awk", "{print $10}"], stdin=subprocess.PIPE)
awk_stdin = awk.communicate(uptime_stdout)[0]
print awk_stdin
temp = awk_stdin
t = temp.strip(",")

我尝试了t = temp.strip(“,”),两种方法都不起作用。


这是代码:

uptime = subprocess.Popen([r"uptime"], stdout=subprocess.PIPE)
uptime_stdout = uptime.communicate()[0]
print uptime_stdout

awk = subprocess.Popen([r"awk", "{print $11}"], stdin=subprocess.PIPE)
awk_stdin = awk.communicate(uptime_stdout)[0]
print repr(awk_stdin)
temp = awk_stdin
tem = temp.rstrip("\n")
logfile = open('/usr/src/python/uptime.log', 'a')
logfile.write(tem + "\n")
logfile.close()

这是输出结果:
 17:07:32 up 27 days, 37 min,  2 users,  load average: 5.23, 5.09, 4.79

5.23,
None
Traceback (most recent call last):
  File "uptime.py", line 21, in ?
    tem = temp.rstrip("\n")
AttributeError: 'NoneType' object has no attribute 'rstrip'

你确定字符串末尾只有逗号吗? - kennytm
你可以展示一下temp是什么吗? - SilentGhost
2
我的第一个猜测是你的字符串不是以逗号而是以换行符结尾。你能发一下 awk 的确切输出吗? - Ivo Wetzel
5个回答

7

那么,我们如何看待这个古老的问题:

if len(str) > 0:
    if str[-1:] == ",":
        str = str[:-1]

经过再次思考,rstrip 本身应该可以很好地工作,因此有关从 awk 获取的字符串的某些内容并不完全符合您的期望。我们需要看到它。
我怀疑这是因为您的字符串实际上并没有以逗号结尾。当您运行:
str = "hello,"
print str.rstrip(",")

str = "hello,\n"
print str.rstrip(",")
print str.rstrip(",\n")

输出结果为:
hello
hello,

hello

换句话说,如果字符串末尾有一个换行符和一个逗号,你需要用",\n"同时去除这两个字符。rstrip可以实现这个目的。

好的,根据您的评论,这是您的尝试:

uptime = subprocess.Popen([r"uptime"], stdout=subprocess.PIPE)
uptime_stdout = uptime.communicate()[0]
print uptime_stdout
awk = subprocess.Popen([r"awk", "{print $11}"], stdin=subprocess.PIPE)
awk_stdin = awk.communicate(uptime_stdout)[0]
print repr(awk_stdin)
temp = awk_stdin
tem = temp.rstrip("\n")
logfile = open('/usr/src/python/uptime.log', 'a')
logfile.write(tem + "\n")
logfile.close()

你从两个print语句中实际上得到了什么,日志文件中添加了什么内容?

我的特定uptime没有$11

23:43:10 up  5:10,  0 users,  load average: 0.00, 0.00, 0.00

但是你的情况可能不同。

尽管如此,我们需要看到你脚本的输出结果。


你肯定不是在暗示内置方法停止工作了吧? - SilentGhost
不,但问题缺少信息。我回答了“如何从字符串末尾删除逗号?” - paxdiablo
uptime = subprocess.Popen([r"uptime"], stdout=subprocess.PIPE) uptime_stdout = uptime.communicate()[0] print uptime_stdoutawk = subprocess.Popen([r"awk", "{print $11}"], stdin=subprocess.PIPE) awk_stdin = awk.communicate(uptime_stdout)[0] print repr(awk_stdin) temp = awk_stdin tem = temp.rstrip("\n") logfile = open('/usr/src/python/uptime.log', 'a') logfile.write(tem + "\n") logfile.close()这是我正在尝试做的事情。 - krisdigitx
那就是负载平均值之后的数值。 - krisdigitx
那么肯定是 $8,而不是 $11 - 如果你想解决这个问题,你真的需要发布你脚本的输出。我们猜测可能出了什么问题并没有什么好处,更多的信息几乎肯定会找到问题的根源。 - paxdiablo

7
当你说
awk = subprocess.Popen([r"awk", "{print $11}"], stdin=subprocess.PIPE)
awk_stdout = awk.communicate(uptime_stdout)[0]

然后将 awk 进程的输出打印到标准输出(例如终端)。 awk_stdout 被设置为 Noneawk_stdout.rstrip('\n') 会引发 AttributeError,因为 None 没有名为 rstrip 的属性。
当你说...
awk = subprocess.Popen([r"awk", "{print $11}"], stdin=subprocess.PIPE,
                       stdout=subprocess.PIPE)
awk_stdout = awk.communicate(uptime_stdout)[0]

如果没有向标准输出(例如终端)打印任何内容,则 awk_stdout 会将 awk 命令的输出作为字符串获取。

太棒了,这个可行, awk = subprocess.Popen([r"awk", "{print $11}"], stdin=subprocess.PIPE, stdout=subprocess.PIPE) - krisdigitx
@kris,我建议你接受这个答案。+1 给抓住它的 @unutbu. - paxdiablo

2

移除字符串末尾的所有逗号:

str = '1234,,,'
str = str.rstrip(',')

1
我认为你可能是想要使用 str.rstrip(',') - Will McCutchen

1

我认为你会发现 awk_stdin 实际上以一个换行符结束(使用print repr(awk_stdin)来清楚地显示),因此在rstrip掉逗号之前,你需要先rstrip掉换行符(或者你可以使用RE同时进行两种操作,但基本思路是逗号实际上不是该字符串中的最后一个字符!-)。


0
如果您的文本中包含空格或非打印字符,可以尝试类似以下的方法:
a_string = 'abcdef,\n'
a_string.strip().rstrip(',') if a_string.strip().endswith(',') else a_string.strip()

它可以帮你省去检查字符串长度和计算切片索引的麻烦。

当然,如果你不需要对不以逗号结尾的字符串进行任何不同的操作,那么你可以直接这样做:

a_string.strip().rstrip(',')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接