【问题标题】:RPython copy string with quotes from R to PythonRPython将带有引号的字符串从R复制到Python
【发布时间】:2015-05-07 05:19:55
【问题描述】:

我无法使用 RPython 将字符串从 R 复制到 Python 中的字符串。如果字符串没有引号,我知道执行此操作的基本步骤,但如果字符串有引号,则会出错。

例如:

test <- "byte"
python.assign("string",test)
python.exec("print(string)")

工作正常并打印:字节

然而,

test <- "'byte'"
python.assign("string",test)

给出错误:

File "<string>", line 2
    string =' [ "'byte'" ] '
                     ^
SyntaxError: invalid syntax

如果我尝试转义引号字符:

test <- "\'byte\'"
python.assign("string",test)

同样的错误:

File "<string>", line 2
    string =' [ "'byte'" ] '
                     ^
SyntaxError: invalid syntax

或者如果我将内部单引号更改为双引号:

test <- "\"byte\""
python.assign("string",test)
Error in python.exec(python.command) : 
  Expecting , delimiter: line 1 column 6 (char 5)

任何想法我错过了什么,或者在哪里看的一些方向?

谢谢

【问题讨论】:

  • 我从来没有用过 RPython,但是你试过 "\\'byte\\'" 吗? (这会告诉 python 引用存在,我猜)
  • 感谢您的建议。不幸的是,我仍然遇到上一个示例中的错误:SyntaxError: invalid syntax
  • 我设法使用 matiasg 建议复制了字符串 {"byte"}(即带双引号的字符串)。所以如果我说: test

标签: python r string rpython


【解决方案1】:

我也在寻找这个问题的好答案。 我只能建议解决方法:

你的例子:

library('rPython')
python.exec("string=chr(39).join(['byte'])")
python.get("string")
[1] "byte"
# Alternatively: python.exec("string=chr(39) + \"byte\" + chr(39)")
# to get: [1] "'byte'"    

更复杂的东西:假设“我想要”“某物”,比如“这个”

library('rPython')
python.exec("string=\"Suppose \" + chr(39) + \"I want\" + chr(39) + \" \" + chr(34) + \"something\" + chr(34) + \" like \" + chr(39) + \"this\" + chr(39)")
python.get("string")
[1] "Suppose 'I want' \"something\" like 'this'"

另一个例子:

library('rPython')
python.exec("myCommand=\"gdal_translate -of GTiff -ot Int16 -a_nodata \" + chr(39) +\"-32768\" + chr(39) + \" NETCDF:\" + chr(39) + \"inputFile\" + chr(39) + \":Soil_Moisture \" + chr(39) + \"outputFile\" + chr(39)")
python.get("myCommand")
[1] "gdal_translate -of GTiff -ot Int16 -a_nodata '-32768' NETCDF:'inputFile':Soil_Moisture 'outputFile'"

【讨论】:

    【解决方案2】:

    借用@matandked,您可以使用gsub 将单引号替换为chr(39)

    library(rPython)
    
    test <- "'byte'"
    
    python.assign("string", gsub("\\'", "' + chr(39) + '", test))
    python.get("string")
    
    # [1] "'byte'"
    

    可能会有意想不到的后果,但python.assign 可以以类似的方式修改:

    python.assign <- function (var.name, value, ...) 
    {
      value <- gsub("\\'", "' + chr(39) + '", value) ## Added this line...
      value <- toJSON(value, collapse = "", ...)
      python.command <- c(paste(var.name, "='", value, "'", sep = " "), 
                          paste(var.name, "= json.loads(", var.name, ")", sep = ""), 
                          paste("if len(", var.name, ") == 1:", sep = ""), paste("    ", 
                                                                                 var.name, "=", var.name, "[0]"))
      python.command <- paste(python.command, collapse = "\n")
      python.exec(python.command)
      invisible(NULL)
    }
    
    
    ## Now there's no need to substitute single quotes:
    python.assign("string", test)
    python.get("string")
    
    # [1] "'byte'"
    

    【讨论】:

      猜你喜欢
      • 2016-11-19
      • 2020-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多