使用os.path.isfile和'and'语句检查2个文件是否存在

时间:2019-06-12 06:42:25

标签: python

昨晚我正在解决一个问题,遇到了一些Redhat 6 Linux shell代码,其中一些嵌入式python代码用于将一个文件追加到另一个文件。我遇到找不到文件错误。由于这是生产代码,因此我隔离并检查了此python语句的逻辑:

if os.path.isfile(str(sys.argv[1]) and str(sys.argv[2])):
  [do the append stuff]
else:
  print("Error: Input file(s) do not exist")

在其他语言中,我希望对os.path.isfile进行两次迭代...

我用两个任意文件“ file1”和“ file2”进行了测试,发现有些奇怪的行为。

append.py "file1" "file2"会按预期触发附加代码

append.py "file1" "file2x"触发错误消息

append.py "file1x" "file2x"触发错误消息

append.py "file1x" "file2"触发附加代码-不需要!

我没想到这最后一次;并可能解释了我的生产问题。

我尝试了类似的操作(很抱歉,无法从安全环境复制粘贴内容,从内存中读取):

if (os.path.isfile(str(sys.argv[1])) and os.path.isfile(str(sys.argv[2]))):

但是得到了相同的结果..所以我现在认为这是另一回事。

为什么第一个操作数被错误地评估为存在?

2 个答案:

答案 0 :(得分:1)

在您的情况下,表达式

import React, { Component } from 'react';
import _ from 'lodash';
import { connect } from 'react-redux';
import {UserCreateEdit} from "../../../core";
import { saveUser } from "../../../core";
import { withRouter } from "react-router-dom";

class UserForm extends UserCreateEdit {
    constructor(props) {
        super(props);
        this.state = {
            fields: [
                ...this.state.fields,
                {
                    "label": "Phone",
                    "name": "phone",
                    "type": "text",
                    "placeholder": "Phone",
                    "options": ""
                }
            ],
            title:"Restaurant: New User"

        };
    }

    // render() {
    //  return (<div style={{ margin: 20 }}>
    //      <UserCreateEdit fields={this.state.fields} title={'Restaurant: New User'} />
    //  </div>);
    // }
}

const mapStateToProps = state => ({
    status: _.get(state, 'users.data.status', [])
});

const mapDispatchToProps = dispatch => ({
    saveUser: (payload) => dispatch(saveUser(payload))
});

export default withRouter(connect(mapStateToProps, mapDispatchToProps)(UserForm));

第一个参数为os.path.isfile(str(sys.argv[1]) and str(sys.argv[2])) ,第二个参数为"file1x"简化为

"file2"

减少到

os.path.isfile(str("file1x") and str("file2"))

os.path.isfile("file2")

记住

True

如果x and y 是真实的,则求值为y

请参见the docs

  

x和y->如果x为假,则为x,否则为y

答案 1 :(得分:0)

实际上,代码检查file1是否存在,或者如果为空,则退回到检查file2是否存在。 a and b如果正确,则返回a,否则返回b

根据定义,sys.argv的元素是字符串,因此str()的调用是多余的无操作。

如果要检查两个文件是否都存在,则尝试的更新代码应该可以使用。或者,您可以执行类似的操作

if all(os.file.isfile(x) for x in sys.argv[1:]):
    print("all these exist and are regular files: {0}".format(sys.argv[1:]))

具有吸引人的附加功能,它不会对预期数量的参数进行硬编码。